【发布时间】:2014-05-10 08:17:36
【问题描述】:
在我的 Spring XML 中,我有以下 sn-p:
<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>
我仍然不确定为什么我原来的代码不起作用,但这已经解决了我的问题
【问题讨论】:
-
作为记录,我也尝试过使用@RequestMapping(value="{path:.+}"),但没有运气
-
也许你遇到过和我一样的问题。看看这个问题:stackoverflow.com/q/22329393/1686330
-
是的,这似乎是同一个问题!我使用了该问题中的等效 XML,并且能够解决我的问题。如果您想将其发布为答案,我很乐意接受!
标签: java spring spring-mvc uri http-status-code-406