通过 Spring MVC 中的配置验证格式参数
Posted
技术标签:
【中文标题】通过 Spring MVC 中的配置验证格式参数【英文标题】:Validate format parameter via config in Spring MVC 【发布时间】:2011-04-09 08:57:10 【问题描述】:这是我的情况:
我将我的 web 服务的 mvc-config.xml 文件设置为将 JSON 作为默认媒体类型。我也将 ContentNegotiatingViewResolver 的喜爱参数设置为 true。此外,我将 useNotAcceptableStatusCode 设置为 true,因此不接受的格式将返回 406。
我的问题是:当有人传入不可接受的格式参数 (format=foo) 时,是否有办法在配置中触发 406 状态代码?还是必须用代码来完成?
这里是配置文件:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="com.work.stuff.web.view.json.ExtendedMappingJacksonJsonView">
<property name="objectMapper">
<ref bean="JacksonObjectMapper" />
</property>
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<ref bean="Jaxb2Marshaller" />
</property>
</bean>
</list>
</property>
<property name="defaultContentType" value="application/json" />
<property name="favorParameter" value="true" />
<property name="useNotAcceptableStatusCode" value="true" />
</bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<ref bean="JacksonObjectMapper" />
</property>
</bean>
<ref bean="marshallingHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="marshallingHttpMessageConverter"
class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="Jaxb2Marshaller" />
<property name="unmarshaller" ref="Jaxb2Marshaller" />
</bean>
<bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
<bean id="JacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
factory-bean="JacksonObjectMapper" factory-method="getSerializationConfig" />
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="JacksonSerializationConfig" />
<property name="targetMethod" value="setSerializationInclusion" />
<property name="arguments">
<list>
<value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
</list>
</property>
</bean>
<bean id="Jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.work.stuff.Concepts</value>
<value>com.work.stuff.Concept</value>
<value>com.work.stuff.Terms</value>
<value>com.work.stuff.Term</value>
<value>com.work.stuff.Namespaces</value>
<value>com.work.stuff.Namespace</value>
<value>com.work.stuff.Subsets</value>
<value>com.work.stuff.Subset</value>
<value>com.work.stuff.Associations</value>
<value>com.work.stuff.Association</value>
</list>
</property>
</bean>
</beans>
【问题讨论】:
【参考方案1】:ContentNegotiatingViewResolver
似乎不支持这种行为。目前,我认为最好的办法是继承它并覆盖 getMediaTypeFromParameter()
方法以在不支持媒体类型时抛出异常。
你可以从那个方法中抛出任何RuntimeException
,如果你用@ResponseStatus
注释异常类,你可以控制HTTP响应代码,例如
@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
public class FormatNotSupportedException extends RuntimeException
从长远来看,我强烈建议您向http://jira.springsource.org 提出问题,要求将此类功能添加到ContentNegotiatingViewResolver
。他们应该能够将其添加为可选的行为参数。正是这样的要求,意味着 Spring 会越来越好。
【讨论】:
非常感谢。我将提出问题(并在时间限制结束时接受并投票)。以上是关于通过 Spring MVC 中的配置验证格式参数的主要内容,如果未能解决你的问题,请参考以下文章