У меня есть поле, которое я хочу отформатировать по-разному при использовании XML и JSON, хотя Джексон читает только аннотацию JAXB @XMLElement, но игнорирует аннотацию Джексона @JsonProperty при сериализации в JSON.
@XmlElementWrapper(name = "ParticipantBindings")
@XmlElement(name = "ParticipantBinding")
@com.fasterxml.jackson.annotation.JsonProperty("participantBindings") // This is ignored?
public List<ParticipantBinding> getParticipantBindings() {
return participantBindings;
}
Мой контроллер загрузки Spring называется так
@GetMapping(path = "/{id}", produces = {MediaType.TEXT_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Participant> getParticipantById(@PathVariable("id") int id) {
Participant p = participantDao.getParticipantFull(id);
if (p == null) {
throw new ResourceNotFoundException();
} else {
return ResponseEntity.ok(p);
}
}
Где ожидаемый результат отправки запроса getrequest с accept-header: application/xml будет таким:
<ParticipantBindings>
<ParticipanBinding>...</ParticipantBinding>
<ParticipanBinding>...</ParticipantBinding>
<ParticipantBindings>
Где для application/json ожидаемый результат должен быть:
"participantBindings": [ ...]
И хотя XML правильно отформатирован, JSON выводится следующим образом:
"ParticipantBinding" : [ ...]




Аннотация @XmlElement(name = "ParticipantBinding") может мешать аннотации @com.fasterxml.jackson.annotation.JsonProperty("participantBindings"). Не могли бы вы случайно убедиться, что ваш ObjectMapper bean-компонент зарегистрировал модуль JaxbAnnotationModule во время выполнения?
Вы можете проверить это, установив ObjectMapper в любом классе и отладив ObjectMapper при вызове метода в классе. Оцените @Autowire, чтобы увидеть, какие модули зарегистрированы.
Если ObjectMapper действительно зарегистрировал модуль (а я предполагаю, что он есть, поскольку вы также можете использовать его для сериализации объекта в XML), вы можете захотеть зарегистрировать отдельные MessageConverters (каждый из которых имеет отдельный ObjectMapper) для отдельных типов носителей. Пример можно найти здесь.
Если вы столкнулись с этой проблемой: преобразователь сообщений Jaxb должен быть настроен на сериализацию запросов xml, но добавляется только в том случае, если JAXB2 присутствует в пути к классам, а jackson xml - нет.