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

Spring MVC方法处理json和表单参数

茅华灿
2023-03-14

我想要在单Springmvc方法中处理内容类型application/x-www-form-urlencoded和application/json。

我在rest服务中要求接受输入作为表单参数或json。我可以通过编写两种方法来实现这一点。无论是形成params还是json,响应将始终是json。

@RequestMapping (method = RequestMethod.POST, produces = {"application/json"},
        consumes = {"application/x-www-form-urlencoded"})
public @ResponseBody Book createBook(Book book)
        throws Exception {
    return book;
}

@RequestMapping (method = RequestMethod.POST, produces = {"application/json"},
        consumes = {"application/json"})
public @ResponseBody Book createBookJSON(@RequestBody Book book)
        throws Exception {
    return book;
} 

有没有可能将这两种方法结合在一起并使其发挥作用?任何帮助都将不胜感激。

编辑

我已经实现了相同的,我的控制器和配置在下面给出,但是当我发送json请求时,我得到空值作为响应。

当我发送表单参数时,它工作正常。帮助我找出问题。

控制器方法

 @RequestMapping (method = RequestMethod.POST, produces = {"application/json", "application/xml"}, consumes = {"application/x-www-form-urlencoded", "application/json"})                   
    public @ResponseBody Book createBook(Book book)
            throws Exception {
        return book;
    }

servlet上下文

<mvc:view-controller path="/" view-name="index"/>

<context:annotation-config />

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
        <map>
            <entry key="xml" value="application/xml" />
            <entry key="json" value="application/json" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <!-- JSON View -->
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

            <!-- JAXB XML View -->
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg>
                    <ref bean="jaxb2Marshaller" />
                </constructor-arg>
            </bean>

        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
    <property name="order" value="1" />
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
                <property name="supportedMediaTypes" value="application/json"/>
            </bean>

            <bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <property name="marshaller" ref="jaxb2Marshaller" />
                <property name="unmarshaller" ref="jaxb2Marshaller" />
                <property name="supportedMediaTypes" value="application/xml"/>
            </bean>

            <bean class = "org.springframework.http.converter.FormHttpMessageConverter">
                <property name="supportedMediaTypes" value = "application/x-www-form-urlencoded" />
            </bean>

            <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
            </bean>
        </list>
    </property>
</bean>

<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" >
    <property name="classesToBeBound">
        <list>
            <value>com.lt.domain.Book</value>
        </list>
    </property>
</bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="order" value="2" />
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

共有2个答案

沈乐邦
2023-03-14

如果您希望Spring自动从JSON转换为您的对象,您必须使用@Request estBody。如果您不使用它,则不会绑定值,并且所有参数都为空,正如您在发送JSON时所描述的那样。

如果您使用RequestBody:spring文档中描述的在后台使用MessageConverters完成转换:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann请求主体

您正在正确配置MappingJacksonHttpMessageConverter,它将JSON转换为您的对象。

缺少的是从表单数据到对象的转换:您注册了一个FormHttpMessageConverter,但根据留档,这不是您期望它做的。它使用x-wan-form-urlencode将请求转换为MultiValueMap

我目前的理解是,您必须编写类似于MappingJacksonHttpMessageConverter的东西,但只能处理表单数据。

陈扬
2023-03-14
@RequestMapping (method = RequestMethod.POST)
public Book createBook(Book book)
        throws Exception {
    return book;
}

消耗需要一个字符串数组,它可以消耗任何东西,Spring bean绑定应该会处理剩下的。问题可能是您没有正确设置bean绑定以自动编组和取消编组json。恕我直言,使用@Request estBody和@RepsonseBody不是最好的选择。

确保jackson已添加到您的依赖项中

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>latest</version>
</dependency>

并使用内容协商视图解析器

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="mediaTypes">
        <map>
            <entry key="htm" value="text/htm"/>
            <entry key="html" value="text/html"/>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="viewResolvers">
        <list>
            <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <property name="suffix" value=".jsp"/>
            </bean>
        </list>
    </property>

    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

        </list>
    </property>
</bean>

确保将客户端应用程序中的accept标头设置为所需的值。您还应该能够在requestmethod注释中删除所有生产和消费数据

 类似资料:
  • 本文向大家介绍javascript表单事件处理方法详解,包括了javascript表单事件处理方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript处理表单事件的常用方法,供大家参考,具体内容如下 1、访问表单对象的常用方法: ①:根据<form>元素的id属性; var myform=document.getElementById("myformid"); 

  • 表单是让用户与我们的网页应用程序交互的基本元素。Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包。这个包使得定义表单和处理提交容易一些。 Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后)就是在 myapp.forms 包中定义一个表单。 # ourapp/forms.py

  • JavaScript 参数处理的基本原理很简单,高级的任务都需要手动操作。 本文首先关注其基本原理然后再行扩展。 1、参数处理的基本原理 JavaScript 的参数处理包括两个要点 1.1、要点:你可以传递任意数量的参数 当调用一个 function 时,你想传递多少参数都可以,这与该函数声明了多少个正式的参数无关。 缺失参数的值是 undefined,多出来的参数则直接被忽略掉。 我们用以下的

  • 本文向大家介绍SpringMVC统一异常处理三种方法详解,包括了SpringMVC统一异常处理三种方法详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringMVC-统一异常处理三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在 Spring MVC 应用的开发中,不管是对底层数据库操作,还是业务层或控制层操作,都

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 本文向大家介绍Springmvc ajax跨域请求处理方法实例详解,包括了Springmvc ajax跨域请求处理方法实例详解的使用技巧和注意事项,需要的朋友参考一下 上次给一个网站写网站  前后端分离 最后跪在ajax跨域上面了  自己在网上找了个方法  亲试可用  记录一下 写一个类  继承HandlerInterceptorAdapter 然后在xml里面配置一下路径  这样就可以了  不过