在我的 Spring XML 中,我有以下代码段:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false"/>
</bean>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
据我了解,这意味着当我有“abc”的映射时,Spring 不应该注册“abc.*”和“abc/”。
在我的一个控制器中,我有一个将图像写入响应的方法:
@RequestMapping(value="{path}", method=RequestMethod.GET, produces=MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public void getPath(
@PathVariable String path,
HttpServletResponse res) {
...
}
当我请求“abc”之类的内容时,这很有效,但是当我请求“abc.com”时,它会在文本中引发 406 错误:
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers."
当我请求“abc.img”时,“path”参数只接收文本“abc”;Spring 省略了扩展。
似乎 Spring 没有正确地忽略后缀模式。为什么是这样?
编辑:我从 Dirk 的评论中翻译了 java 配置,下面的 XML 似乎解决了这个问题:
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
我仍然不确定为什么我的原始代码不起作用,但这解决了我的问题