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

Java 处理json和表单参数的Spring MVC方法,java,json,jakarta-ee,spring-mvc,Java,Json,Jakarta Ee,Spring Mvc,我想要在single spring mvc方法中处理内容类型application/x-www-form-urlencoded和application/json 我在rest服务中有一个要求,即接受作为表单参数或json的输入。我可以通过编写两种方法来实现这一点。无论是formparams还是json,响应都将始终是json @RequestMapping (method = RequestMethod.POST, produces = {"application/json"},

我想要在single spring mvc方法中处理内容类型application/x-www-form-urlencoded和application/json

我在rest服务中有一个要求,即接受作为表单参数或json的输入。我可以通过编写两种方法来实现这一点。无论是formparams还是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上下文


com.lt.domain.Book
consumes获取一个字符串数组,该数组包含它可以使用的任何内容,Springbean绑定应该负责其余部分。问题可能是您没有正确设置bean绑定以便自动整理和取消整理json。使用@RequestBody和@RepsonseBody并不是imho的最佳选择

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

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

org.codehaus.jackson
杰克逊地图绘制者
最新的
并使用ContentNegotingViewResolver


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

如果您希望spring自动将JSON转换为您的对象,您必须使用
@RequestBody
。如果您不使用它,那么这些值将不会被绑定,并且所有参数都是空的,正如您在发送JSON时所描述的那样

如果使用
@RequestBody
:在幕后,转换是使用MessageConverter完成的,如spring文档中所述:

您正在正确配置映射JacksonHttpMessageConverter,它将JSON转换为您的对象

缺少的是从表单数据到对象的转换: 您注册了一个
FormHttpMessageConverter
,但根据文档,这并不是您所期望的。它使用x-www-form-urlencode将请求转换为
多值映射
,而不是转换为自定义对象


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

我已经按照您的建议实现了。用我面临的问题更新了问题。请告诉我哪里出错了。您接收的对象是否为null?您还应该删除@ResponseBy注释。如果我以json形式发送请求,则我将以null形式接收对象属性。如果我以form params的形式发送请求,那么它工作正常。如果我删除响应体注释,我会得到404错误。我一直在阅读以删除@RequestBody,但事实证明它确实能让事情顺利进行!
@RequestMapping (method = RequestMethod.POST)
public Book createBook(Book book)
        throws Exception {
    return book;
}
<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>