gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:14 24 4
gpt4 key购买 nike

我想在单个 spring 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;
}

是否可以将这两种方法合二为一并使其发挥作用?任何帮助都感激不尽。

编辑

我已经实现了相同的,我的 Controller 和配置如下所示,但是当我发送 json 请求时,我得到空值作为响应。

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

Controller 方法

 @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 绑定(bind)应该处理其余部分。问题可能是您没有正确设置 bean 绑定(bind)以便自动编码和解码 json。使用@RequestBody 和@RepsonseBody 并不是最佳选择恕我直言。

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

<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>

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

关于java - 处理 json 和表单参数的 Spring MVC 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com