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

SpringMVC:不反序列化JSON请求体

桓智敏
2023-03-14

我正在从事一个SpringMVC项目,我需要完成的任务之一是让用户在POST请求中发送一个JSON数据字符串。我知道Spring将使用Jackson对对象反序列化JSON,但如果我尝试以下方法:

@RequestMapping(value = "/test", method = RequestMethod.POST)
public void doSomething(@RequestBody String json) {
    // do something
}

我只是返回HTTP 400错误请求(“客户端发送的请求在语法上不正确”)。

如何获取客户端作为字符串发送的原始JSON?

共有3个答案

孔硕
2023-03-14

您可以尝试完全避免@ask estBody,而是直接通过InputStream/ReaderWebRequest/HttpServletRequest获取请求主体。

罗凯
2023-03-14

我们需要一些控制器方法将POST主体映射到bean,而其他方法只需要原始字符串。要使用@RequestBody注释实现这一点,您需要配置多个消息转换器,例如。。。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="useDefaultSuffixPattern" value="false"/>
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonConverter" />
            <ref bean="marshallingConverter" />
            <ref bean="stringHttpMessageConverter" />
        </list>
    </property>
</bean>

<bean id="jsonConverter"
      class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean id="marshallingConverter"
      class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <constructor-arg ref="jaxb2Marshaller" />
    <property name="supportedMediaTypes" value="application/xml"/>
</bean>

<bean id="stringHttpMessageConverter"
      class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes" value="text/plain"/>
</bean>

然后,对各种方法的请求必须指定具有适当值的"内容类型"标题。对于请求主体映射到JAXB bean的那些方法,指定"Application/xml"。对于请求主体为String的请求,请使用"text/普通"。

奚修伟
2023-03-14

当SpringMVC发现一个与URL路径匹配的请求映射,但参数(或头等)与处理程序方法所期望的不匹配时,通常会看到这种类型的错误。

如果您使用@RequestBody注释,那么我相信SpringMVC希望将POST请求的整个主体映射到一个对象。我猜你的身体不仅仅是一个字符串,而是一个完整的JSON对象。

如果您有一个您期望的JSON对象的java模型,那么您可以将String参数替换为do某物声明中的参数,例如

公共空格做某事(@刚体MyObject myobj){

如果您没有与JSON匹配的Java对象,那么您可以尝试将字符串类型替换为映射以使其正常工作

您还可以在SpringMVC中打开调试日志记录,以获得关于为什么这是一个错误请求的更多信息。

编辑:根据您在注释中的需求,您可以简单地将HttpServletRequest注入到您的方法中,然后自己阅读正文。

public void doSomething(HttpServletRequest request) {
  String jsonBody = IOUtils.toString( request.getInputStream());
  // do stuff
}

 类似资料:
  • 问题内容: 我有以下JSON字符串要反序列化: 我正在使用DataContractJsonSerializer方法。 它由项目数组组成,我找不到使用VB.Net可以反序列化此结构的示例。我具有以下Application类来存储此信息: 问题答案: 我建议你使用过。原因如下: 更快 比简单的序列化需要更多的代码。 您无需将and 属性与 使用此数据类 并使用它反序列化您的: 如果仍要使用,则可以使用

  • 我有一个简单的问题,假设我有这个json 以这种方式映射: 我想知道是否可以通过使用一些自定义setter/注释或其他东西在内部对象中保存一个外部字段: PS:由于json的复杂性,使用自定义反序列化是我最后的选择

  • 我想解析这个json文件。 {“特征”:[{“类型”:“特征”,“几何”:“{“类型”:“多边形”,“坐标”:[[26.4217861898109,40.127607984644],[26.4219934821323,40.1275230229872],[26.4218810759267,40.1273800013679],[26.4216801413981,40.1274730404221],[

  • 我的JSON如下: 我找到了Newtonsoft JSON。NET为C#反序列化库。我试着使用它如下: 如何访问对象以获取所有“类型”数据?我尝试了一个循环,但它不起作用,因为对象没有枚举器。

  • 问题内容: 我有一个WCF服务定义如下: 所述类的定义为: ILayoutService的实现如下: 我实现了,所以我可以得到将被(反)序列化的原义JSON。我正在使用它来测试通过jQuery调用此服务: 返回的布局是VB代码中调用返回的确切JSON 。出于某种原因,当我调用Web服务,输入参数在什么都不是。反序列化一定会失败。知道为什么吗? 问题答案: 仅凭您提供的细节很难分辨。 这是我的建议:

  • 问题内容: 我正在使用大猩猩 websocket,并且正在计划使用json进行序列化/反序列化。 假设我有这样的结构来接收传入的消息: 和 大猩猩提供接收传入的消息。传入的消息可以是Foo或Bar,但是我不能使用和收听其他消息,这很混乱。我想要像javascript 这样的东西。如果接收到Foo,则如何处理传入消息,然后将其存储到结构中;如果接收到Bar,则将其存储到结构中? 我正在解决方案正在使