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.
См. документацию Джексона на обработку двунаправленных ссылок с использованием декларативных методов для справки.