Spring MVC方法处理json和form params
我想在单弹簧mvc方法中处理内容类型application / x-www-form-urlencoded和application / json。
我有一个休息服务的要求,接受输入作为形式参数或JSON。 我可以通过写两种方法来实现这一点。 无论是形式参数还是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>
@RequestMapping (method = RequestMethod.POST)
public Book createBook(Book book)
throws Exception {
return book;
}
consumes接受一个可以使用的字符串数组,spring bean绑定应该照顾剩下的部分。 问题可能是你没有正确设置bean绑定,以便自动组织和解组json。 使用@RequestBody和@RepsonseBody不是imho的最佳选择。
确保杰克逊已添加到您的依赖项中
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>latest</version>
</dependency>
并使用contentnegotiatingviewresolver
<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>
确保接受标头在您的客户端应用程序中设置为所需的值。 您还应该能够删除requestmethod注释中的所有生产和消费数据
如果你想弹簧从JSON自动转换为你的对象,你将不得不使用@RequestBody
。 如果您不使用它,那么这些值将不会被绑定,并且所有参数都是空的,就像您在使用JSON发送时所描述的那样。
如果您使用@RequestBody
:在幕后,使用MessageConverters完成转换,如在spring文档中所述:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc的.html#MVC-ANN-requestbody
您正确配置了MappingJacksonHttpMessageConverter
,它将JSON转换为您的对象。
缺少的是从表单数据到你的对象的翻译:你有一个FormHttpMessageConverter
注册,但根据文档,这不是你期望它做的。 它使用x-www-form-urlencode将请求转换为MultiValueMap<String, String>
而不是您的自定义对象。
我目前的理解是,你将不得不写一些类似于MappingJacksonHttpMessageConverter
东西,但只能处理表单数据。