我希望这不是一个简单的问题。我是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'用于类型的方法参数 串”, “路径”: “/例如”}
我知道其他所有其他控制器都正常连接,
我觉得我必须在这里错过一些基本的校长。
提前致谢。
答案 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;
}
}