Spring ОТДЫХ | MappingJacksonHttpMessageConverter создает недопустимый JSON

Я реализовал веб-службу RESTful с помощью Spring. Служба отвечает в XML или JSON на основе заголовка Accept. Здесь отображение 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..

Ответы

Ответ 1

Вы используете XStream для сериализации ответов XML и Jackson JSON для сериализации ответов JSON. Глядя на вывод JSON, который вы опубликовали, кажется, что есть круглый справочный вопрос. Я предполагаю, что Entity имеет список атрибутов, каждый из которых указывает на их соответствующий объект. XStream прозрачно обрабатывает циклические ссылки с помощью XPath, это позволяет сохранять ссылки при десериализации обратно к объектам. Джексон способен обрабатывать циклические ссылки с версии 1.6, но вам нужно помочь, аннотируя ваши сериализованные объекты с помощью @JsonManagedReference и @JsonBackReference. Я думаю, что Джексон уникален в предоставлении обратных ссылок в сериализации JSON.

См. документацию Джексона на обработку двунаправленных ссылок с использованием декларативных методов для справки.