我的Spring-MVC ContentNegotiatingViewResolver是否正确设置?如何为不支持的媒体类型发送404错误?

ege*_*ari 12 java spring view spring-mvc content-negotiation

我不知道这是否是这个网站的有效问题,但我想知道是否有经验丰富的ContentNegotiatingViewResolver可以看看这个,让我知道我是否正确设置并帮助我发送404消息.

我想做的是使所有没有扩展名的网址默认为HTML表示(在我的情况下是freemarker视图).我想接受附加了".json"的网址来代替json.这似乎适用于Firefox,即Chrome和Chrome.我猜它在其他浏览器中有效吗?我确保禁用接受标头,因为它是一个邪恶的功能,并不像文档说的那样真正起作用.

我试图用".stuff"访问网址,只是为了看看会发生什么,并且在我的配置下,会出现一个空白屏幕.这可以接受吗?有什么办法可以发送404错误吗?

还有什么我可能没有正确配置?

<bean id="contentNegotiatingViewResolver"
      class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="text/html" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="useNotAcceptableStatusCode" value="true" />
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <property name="contentType" value="application/json" />
            </bean>
        </list>
    </property>
    <property name="viewResolvers">
        <list>
            <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                <property name="contentType" value="text/html" />
                <property name="order" value="2"/>
                <property name="cache" value="true"/>
                <property name="prefix" value=""/>
                <property name="suffix" value=".ftl"/>
                <property name="exposeSpringMacroHelpers" value="true"/>
            </bean>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

Ass*_*lov 1

因为您设置了 defaultContentType,所以协商最终总是会找到 freemarker 视图提供的匹配内容类型。引用 ContentNegotiatingViewResolver 的 javadoc:

您还可以直接设置 setDefaultContentType,当其他机制(Accept header、文件扩展名或参数)不匹配时将返回该 setDefaultContentType。

通过此设置,文件扩展名 .stuff 与 contentType text/html 匹配。

然后,使用 useNotAcceptableStatusCode:

如果未找到匹配项,将返回 406(不可接受)状态代码。

我刚刚尝试了这个(使用另一个 REST 服务应用程序的设置)并看到 Chrome 显示消息:此请求标识的资源只能生成具有根据请求“accept” headers() 不可接受的特征的响应。