Java Spring不会忽略文件扩展名
在我的Spring XML中,我有以下代码片段:Java Spring不会忽略文件扩展名,java,spring,spring-mvc,uri,http-status-code-406,Java,Spring,Spring Mvc,Uri,Http Status Code 406,在我的Spring XML中,我有以下代码片段: <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false"/> </bean> <mvc:annotation-driven> <mvc:m
<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”的内容时,这非常有效,但当我请求“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似乎没有正确地忽略后缀模式。为什么会这样
编辑:我根据德克的评论翻译了java配置,下面的XML似乎解决了这个问题:
我仍然不确定我的原始代码为什么不起作用,但这解决了我的问题当一个请求传入spring dispatcher时,控制器映射/匹配的一部分是将客户端的可接受媒体类型与控制器端的可生产媒体类型相匹配(因此,您可以使用只能通过其生成的媒体类型来区分的控制器) 坏消息是springmvc在其默认配置中倾向于请求url的扩展,而不是请求中的任何accept头 在您的示例中,当您请求
abc
时,扩展上没有匹配项,因此其他内容协商策略最终将解析为正确的类型(通过accept
header)但是如果您请求abc.com
spring将派生一个mime类型的application/octet-stream
,它与控制器的不匹配,生成一个406
(因为没有匹配的控制器)
您可以在org/springframework/mail/javamail/mime.types
中的spring-context-support.jar中找到路径扩展的默认mime匹配(请参阅)
您可以在dispatcher配置中禁用此“功能”,以便spring不会使用路径扩展来解析mime类型:
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
如果您正在使用java配置,请查看我的。记录,我还尝试使用@RequestMapping(value=“{path:.+}”),但幸运的是,你可能遇到了与我相同的问题。看看这个问题:是的,这似乎是同一个问题!我使用了该问题中的等效XML,并能够解决我的问题。如果你想将其作为答案发布,我很乐意接受!完美的答案。但别忘了指定自定义内容Negot注释驱动->''中的注释管理器另请参见:for JavaConfig@ImpulseTheFox或者使用。从5.3版开始,favorPathExtension
默认为false,因此不再需要此解决方法。请参阅。
<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>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>