Spring配置GET参数内容协商请求application/rdf+xml返回406异常求解
问题根因
- URL参数特殊字符转义问题
URL 规范中+号默认会被解码为空格,你请求时传入format=application/rdf+xml,Spring 实际拿到的 format 参数值为application/rdf xml,和你在内容协商配置中注册的键application/rdf+xml无法匹配,自然找不到对应的处理方法。你贴的Tomcat日志是原始输入日志,还没经过解码阶段,所以看起来+还存在,实际解码后已经变成空格。 - 可选优化点:内容协商键冗余
你配置的mediaType方法第一个参数是format参数的取值别名,不需要写完整的媒体类型字符串,完全可以用短别名避免特殊字符问题。
解决方法
方法1:对+做URL编码
将请求路径中的+替换为URL编码值%2B,访问地址改为:http://localhost:8080/test?format=application/rdf%2Bxml
即可正常匹配到testRdf方法。
方法2:修改媒体类型别名(更推荐)
调整内容协商配置,给application/rdf+xml设置短别名,避免特殊字符:
override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) { configurer.favorParameter(true) .parameterName("format") .ignoreAcceptHeader(false) .defaultContentType(MediaType.APPLICATION_JSON) .mediaType("text", MediaType.TEXT_PLAIN) .mediaType("json", MediaType.APPLICATION_JSON) .mediaType("rdf", MediaType("application", "rdf+xml")) }
对应的控制器方法不需要修改,请求时直接传短别名即可:http://localhost:8080/test?format=rdf
这种方式更简洁,也完全规避了特殊字符转义的问题。
补充排查项
如果你确认编码后还是406,可以检查以下两点:
- 你的Web配置类是否加上了
@Configuration注解,且没有被组件扫描排除 - 方法上的
produces属性值是否拼写正确,没有多余空格或符号
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

