当前位置: 首页 > 知识库问答 >
问题:

Spring不会忽略文件扩展名

楚羽
2023-03-14

在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>
@RequestMapping(value="{path}", method=RequestMethod.GET, produces=MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public void getPath(
        @PathVariable String path,
        HttpServletResponse res) {

    ...
}
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers."
<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>

共有1个答案

傅星光
2023-03-14

当一个请求进入spring dispatcher时,控制器映射/匹配的一部分是将客户端接受的媒体类型匹配到控制器端可生成的媒体类型(因此您可以拥有仅可通过其生成的媒体类型区分的控制器)。

消息是springmvc在其默认配置中更倾向于请求url的扩展,而不是请求中的任何accept头。

在您的示例中,当您请求abc时,扩展上没有匹配项,因此其他内容协商策略将介入,最终解析为正确的类型(通过accept头)。但是,如果您请求abc.com,spring将派生一个mime类型的application/octet-stream与您的控制器的product不匹配,并生成一个406(因为没有匹配的控制器)。

您可以在dispatcher配置中禁用此“特性”,这样spring就不会使用路径扩展来解析MIME类型:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
</bean>

如果您正在使用java配置,请查看我的相关问题/答案。

 类似资料:
  • 问题内容: 我正在使用.NET 2.0,Linq毫无疑问。我想检查文件是否存在于目录中, 而无需了解文件扩展名 。 我只需要完成此逻辑即可。 1.使用搜索模式提供的字符串文件名检查目录中的文件是否存在,而忽略文件的扩展名 2.获取文件(如果存在)并进行数据绑定以提供。如果文件不存在,则开始上载文件。 更新: 和确实解决了其中我检查文件的存在的部分。至于FileInfo对象的性能,这些仅是我对数据绑

  • 在项目的根目录中,我有一个文件夹。在文件夹中,我有一个文件夹。我想忽略对文件夹中所有文件的所有更改。我的中包含以下内容: 在我的中,我看到了应该被忽略的文件。原因是什么?我怎样才能成功地忽略我的栏文件夹中的所有文件? 请注意,以前用同一行忽略了这些文件,但我不得不临时删除这一行,以便在服务器上执行命令。在之后,我将行放回中。这是一段时间以前的事了,但现在我观察到文件将处于。我希望能够修改被忽略的文

  • 我的异步方法有问题。它工作正常,但线程数一直在增加。 下面是我的代码示例: 位于GitHub的完整项目:https://github.com/rublin/KarboMarketplaceExplorer 直接链接到类 下面是一个测试,涵盖了这种行为。

  • 问题内容: 我正在与其他一些开发人员一起进行django项目,最近我们意识到应用程序中的所有.pwc文件都会导致提交和存储库混乱。 有什么办法可以从git存储库中的所有子目录中删除所有.pwc文件,然后在以后的提交中忽略它们? 问题答案: 删除它们的方法很多: 注意:如果您尚未提交它们,请使用,而不是。 要在以后忽略它们,只需将* .pwc添加到.gitignore中。(如果没有该文件,请在存储库

  • 我在应用程序中设置了以下Maven多模块。属性以及模块A中相应的属性类和配置: 应用程序。特性: 以及 然后是模块C和我的应用程序: 相关: 还有豆子测试。属性文件: 从中删除最后一个bean时,应用程序将启动。但是,有了这个bean定义,我得到了以下错误: 描述:无法注册在类路径资源[c/CConfiguration.class]中定义的bean“cityProperties”。已在文件[/mo