Spring Controller不接受以.uri结尾的url

时间:2019-03-21 14:51:22

标签: spring spring-mvc

我已经定义了以下控制器

@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

3 个答案:

答案 0 :(得分:2)

尝试其他正则表达式。

代替

.*

表示:除换行符外的各种字符

尝试

[a-z]*\.[a-z]*

这意味着 各种数量的a-z +一个点+各种数量的a-z

如果这是您想要的。

如果您不需要任何图案,则只需使用

{name}

结帐

https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/uri-pattern.html

https://regexr.com/

但是我会考虑是否可以调整您的API,例如:

@RequestMapping(value = "/config/{name}/{type}", ...

我认为在您的URI中期望点不是一个好主意。 点表示您正在请求文件。

结帐:

Spring MVC @PathVariable with dot (.) is getting truncated

答案 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);
}