我已经定义了以下控制器
@Controller
公共类HelloController {
@RequestMapping(value = "/config/{name:.*}", produces = MediaType.TEXT_PLAIN_VALUE, method = RequestMethod.GET)
@ResponseBody
ResponseEntity<String> getValue(@PathVariable String name) {
String value = "Hello World";
return new ResponseEntity<String>(HttpStatus.OK);
}
}
当我从浏览器前ping URL时: http://localhost:8080/example/config/test.abc
请求正常。
但是当我使用URL ping时 http://localhost:8080/example/config/test.uri
它只是用错误将页面炸毁:
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.
我尝试了MessageConverters和configureContentNegotiation似乎没有任何作用。 我想知道spring是否将test.uri视为无效模式或保留关键字。
我尝试过的环境。 春季4 / Tomcat 7和8 春季5 / Tomcat 9
答案 0 :(得分:2)
尝试其他正则表达式。
代替
.*
表示:除换行符外的各种字符
尝试
[a-z]*\.[a-z]*
这意味着 各种数量的a-z +一个点+各种数量的a-z
如果这是您想要的。
如果您不需要任何图案,则只需使用
{name}
结帐
https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/uri-pattern.html
和
但是我会考虑是否可以调整您的API,例如:
@RequestMapping(value = "/config/{name}/{type}", ...
我认为在您的URI中期望点不是一个好主意。 点表示您正在请求文件。
结帐:
答案 1 :(得分:0)
Spring认为最后一个点后面的任何东西都是文件扩展名
要克服这一点
通过添加正则表达式映射来修改@PathVariable定义
@RequestMapping(value = "/config/{name:.+}"
一个安全的猜测是
.abc
不是扩展名类型,.uri
是一个扩展名,所以也许这就是您的第一个URL有效的原因
答案 2 :(得分:0)
我终于可以使用ContentNegotiationConfigurer并为uri设置内容类型来解决问题。
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {
contentNegotiationConfigurer.mediaType("uri", MediaType.TEXT_PLAIN);
}