如何使用spring正确管理PathVariables

时间:2016-01-10 08:36:39

标签: java spring

我希望这不是一个简单的问题。我是java web services世界的新手,似乎无法访问我的控制器中的PathVariables。我正在使用STS,并不抱怨我的语法错误。

比正确答案更重要的是,我真的很想知道为什么这不起作用。

以下是我无法解决的一些示例代码:

@RestController
public class TestController {

    @RequestMapping("/example")
    public String doAThing(
        @PathVariable String test
    ) throws MessagingException {
        return "Your variable is " + test;
    }
}

如果我像这样对它进行卷曲:

curl http://localhost:8080/example?test=foo

我收到以下回复:

  

{“timestamp”:1452414817725,“status”:500,“error”:“内部服务器   错误 “ ”异常“: ”org.springframework.web.bind.MissingPathVariableException“, ”消息“:” 缺少   URI模板变量'test'用于类型的方法参数   串”, “路径”: “/例如”}

我知道其他所有其他控制器都正常连接,

我觉得我必须在这里错过一些基本的校长。

提前致谢。

4 个答案:

答案 0 :(得分:4)

如果您正在使用路径变量,那么它必须是URI的一部分。正如您在URI中未提及但在方法参数中使用的那样,spring尝试从路径URI中找出并分配此值。但是这个路径变量不在路径URI中,因此抛出MissingPathVariableException。

这应该有效。

@RestController
public class TestController {

@RequestMapping("/example/{test}")
public String doAThing(
    @PathVariable String test
) throws MessagingException {
    return "Your variable is " + test;
}
}

你的卷曲请求就像

curl http://localhost:8080/example/foo
//here the foo can be replace with other string values

答案 1 :(得分:3)

Spring支持不同的方法如何将url中的东西映射到方法参数:请求参数和路径变量

  • 请求参数取自url-query参数(和请求正文,例如在http-POST请求中)。用于标记应从请求参数获取其值的java方法参数的注释是@RequestParam

  • 路径变量(称为路径模板的somtimes)是url-path的一部分。用于标记应从请求参数获取其值的java方法参数的注释是@PathVariable

看一下我的this answer,举个例子,链接到Spring Reference。

那么您的问题是什么:您想要读取请求参数(来自url-query部分),但是使用了路径变量的注释。因此,您必须使用@RequestParam代替@PathVariable

@RestController
public class TestController {

    @RequestMapping("/example")
    public String doAThing(@RequestParam("test") String test) throws MessagingException {
        return "Your variable is " + test;
    }
}

答案 2 :(得分:2)

它无法正常工作的原因是有两种方法可以使用RestController将参数传递给REST API实现。一个是PathVariable,另一个是RequestParam。它们都需要在RequestMapping注释中指定名称。

查看详细解释RequestMapping的this优秀资源

尝试此解决方案。

@RequestMapping("/example/{test}", method= RequestMethod.GET)
public String doAThing(
    @PathVariable("test") String test
) throws MessagingException {
    return "Your variable is " + test;
}

答案 3 :(得分:0)

我的解决方案是:

@RestController
@RequestMapping("/products")
@EnableTransactionManagement
public class ProductController {
    @RequestMapping(method = RequestMethod.POST)
    public Product save(@RequestBody Product product) {
        Product result = productService.save(product);
        return result;
    }
}