Spring控制器不接受以.uri结尾的url
我已经定义了以下控制器Spring控制器不接受以.uri结尾的url,spring,spring-mvc,Spring,Spring Mvc,我已经定义了以下控制器 @Controller 公共类Hello控制器{ @RequestMapping(value = "/config/{name:.*}", produces = MediaType.TEXT_PLAIN_VALUE, method = RequestMethod.GET) @ResponseBody ResponseEntity<String> getValue(@PathVariable String name) { String value =
@Controller
公共类Hello控制器{
@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);
}
@RequestMapping(value=“/config/{name:.*}”,products=MediaType.TEXT\u PLAIN\u value,method=RequestMethod.GET)
@应答器
ResponseEntity getValue(@PathVariable字符串名称){
String value=“Hello World”;
返回新的响应状态(HttpStatus.OK);
}
}
当我从浏览器ping url时,例如:
这个请求很有效
但是当我用url ping时
它只是在页面上弹出错误:
此请求标识的资源只能根据请求“接受”标题生成具有不可接受特征的响应。
我尝试了MessageConverters和configureContentNegotiation,但似乎没有任何效果。
我想知道spring是否将test.uri视为无效模式或保留关键字
我试过了。
弹簧4/Tomcat 7和8
Spring 5/Tomcat 9尝试不同的正则表达式
而不是
.*
这意味着:除新行以外的任意字符数
试一试
也就是说
不同数量的a-z+一个点+不同数量的a-z
如果这是你想要的
如果你不需要任何图案,那就用吧
{name}
结帐
及
<>但是我会考虑你是否可以调整你的API,比如:
@RequestMapping(value = "/config/{name}/{type}", ...
我认为在URI中使用点不是一个好主意。
点表示您正在请求一个文件
结帐:
尝试不同的正则表达式
而不是
.*
这意味着:除新行以外的任意字符数
试一试
也就是说
不同数量的a-z+一个点+不同数量的a-z
如果这是你想要的
如果你不需要任何图案,那就用吧
{name}
结帐
及
<>但是我会考虑你是否可以调整你的API,比如:
@RequestMapping(value = "/config/{name}/{type}", ...
我认为在URI中使用点不是一个好主意。
点表示您正在请求一个文件
结帐:
Spring认为最后一个点后面的任何内容都是文件扩展名 为了克服这个问题 通过添加正则表达式映射修改@PathVariable定义
@RequestMapping(value = "/config/{name:.+}"
一个安全的猜测是
.abc
不是扩展名类型,.uri
是一个扩展名,所以可能这就是第一个URL工作的原因,Spring认为最后一个点后面的任何内容都是文件扩展名
为了克服这个问题
通过添加正则表达式映射修改@PathVariable定义
@RequestMapping(value = "/config/{name:.+}"
一个安全的猜测是
.abc
不是扩展类型,.uri
是一个扩展,所以这可能就是您的第一个URL工作的原因,我终于能够使用ContentNegotiationConfigurer并设置uri的内容类型来解决问题
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {
contentNegotiationConfigurer.mediaType("uri", MediaType.TEXT_PLAIN);
}
我最终能够使用ContentNegotiationConfigurer和设置uri的内容类型来解决这个问题
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {
contentNegotiationConfigurer.mediaType("uri", MediaType.TEXT_PLAIN);
}
你能解释一下为什么test.test,test.url工作,但是test.uri不工作吗?在回答中,我尝试了{name}和[a-z]*\.[a-z]*没有多少运气。我不能使用@RequestMapping(value=“/config/{name}/{type}”的模式,因为这对我们来说是一个非常大的改变。然后,也许可以尝试/somepath/{variable:.+}如我在上一个链接中所述。你能解释一下为什么test.test,test.url工作,但test.uri不工作吗?在回答中,我尝试了{name}和[a-z]*\.[a-z]*运气不好。我不能使用@RequestMapping(value=“/config/{name}/{type}”的模式,因为这对我们来说是一个非常大的变化,然后可能尝试/somepath/{variable:.+},如我上一个链接中所述