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)
因为您设置了 defaultContentType,所以协商最终总是会找到 freemarker 视图提供的匹配内容类型。引用 ContentNegotiatingViewResolver 的 javadoc:
您还可以直接设置 setDefaultContentType,当其他机制(Accept header、文件扩展名或参数)不匹配时将返回该 setDefaultContentType。
通过此设置,文件扩展名 .stuff 与 contentType text/html 匹配。
然后,使用 useNotAcceptableStatusCode:
如果未找到匹配项,将返回 406(不可接受)状态代码。
我刚刚尝试了这个(使用另一个 REST 服务应用程序的设置)并看到 Chrome 显示消息:此请求标识的资源只能生成具有根据请求“accept” headers() 不可接受的特征的响应。
归档时间: |
|
查看次数: |
2295 次 |
最近记录: |