MappingJacksonHttpMessageConverter产生无效的JSON

我已经用Spring实现了一个RESTful Web服务。 该服务基于Accept头以XML或JSON响应。 这是context.xml映射:

  <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"/>
  <bean id="xmlMessageConverter"
        class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <constructor-arg ref="xstreamMarshaller"/>
    <property name="supportedMediaTypes" value="application/xml"/>
  </bean>

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

  <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <util:list id="beanList">
        <ref bean="xmlMessageConverter"/>
        <ref bean="jsonHttpMessageConverter"/>
      </util:list>
    </property>
  </bean>

这是我的控制器方法:

@Controller
@RequestMapping(value = "/entityService")
class RestfulEntityService {

  @Resource
  private EntityService entityService;

  @ResponseBody
  @RequestMapping(value = "/getAllEntities", method = RequestMethod.GET)
  public List<Entity> getAllEntities() {
    return entityService.getAllEntities();
  }
}

XML响应是有效的,但是,当客户端将Accept头部设置为application / json时,响应是无效的JSON。

这是JSON响应示例:

[{"id":3,"attributes":[{"id":18,"attributeValue":null,"attributeName":"mobile","attributeType":"varchar(40)","entity":{"id":3,"attributes":[{"id":18,"attributeValue":null,"attributeName":"mobile","attributeType":"varchar(40)","entity":{"id":3,"attributes":[{"id":18,"attributeValue":null,"attributeName":"mobile","attributeType":"varchar(40)","entity":{"id":3,"attributes": ..... repeats for a while and then stops..

您正在使用XStream来序列化XML响应,并使用Jackson JSON序列化JSON响应。 看看你发布的JSON输出,似乎手头上有一个循环引用问题。 我猜Entity有一个属性列表,每个属性都指向它们各自的实体。 XStream通过使用XPath透明地处理循环引用,这允许在反序列化回对象时保留引用。 Jackson能够处理自v1.6以来的循环引用,但您需要通过@JsonManagedReference@JsonBackReference注释序列化实体来帮助它。 我认为杰克逊在允许在JSON序列化中返回引用方面是独一无二的。

请参阅Jackson关于使用声明性方法处理双向引用的文档以供参考。

链接地址: http://www.djcxy.com/p/8515.html

上一篇: MappingJacksonHttpMessageConverter produces invalid JSON

下一篇: How to post JSON to PHP with curl