ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-通过Spring MVC中的configure验证format参数

2019-12-09 05:29:54  阅读:250  来源: 互联网

标签:content-type spring json java spring-mvc


这是我的情况:

我为我的Web服务设置了mvc-config.xml文件,以将JSON作为默认媒体类型.我也为ContentNegotiatingViewResolver提供了avourpParameter.此外,我将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>

解决方法:

ContentNegotiatingViewResolver似乎不支持这种行为.就目前而言,我认为最好的选择是将其子类化并重写getMediaTypeFromParameter()方法,以在不支持媒体类型的情况下引发异常.

您可以从该方法引发任何RuntimeException,如果您使用@ResponseStatus注释异常类,则可以控制HTTP响应代码,例如

@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
public class FormatNotSupportedException extends RuntimeException {
}

从长远来看,我强烈建议您提出http://jira.springsource.org的问题,要求将此类功能添加到ContentNegotiatingViewResolver.他们应该能够将此添加为可选的行为参数.像这样的请求意味着Spring不断变得更好.

标签:content-type,spring,json,java,spring-mvc
来源: https://codeday.me/bug/20191209/2096775.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有