Весенний ОТДЫХ | MappingJacksonHttpMessageConverter создает недопустимый JSON - PullRequest
6 голосов
/ 10 апреля 2011

Я реализовал 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 Ответ

12 голосов
/ 11 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...