我有一个字段,我希望在使用XML和JSON时采用不同的格式,尽管Jackson在序列化为JSON时只读取JAXB注解@XMLElement
,但忽略Jackson注解@JsonProperty
。
@XmlElementWrapper(name = "ParticipantBindings")
@XmlElement(name = "ParticipantBinding")
@com.fasterxml.jackson.annotation.JsonProperty("participantBindings") // This is ignored?
public List<ParticipantBinding> getParticipantBindings() {
return participantBindings;
}
我的Sping Boot 控制器也是这么叫的
@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);
}
}
其中,发送带有accept-header的getrequest的预期结果为:application/xml应该是:
<ParticipantBindings>
<ParticipanBinding>...</ParticipantBinding>
<ParticipanBinding>...</ParticipantBinding>
<ParticipantBindings>
对于application/json,预期结果应该是:
"participantBindings": [ ...]
虽然XML格式正确,但JSON输出如下:
"ParticipantBinding" : [ ...]
1条答案
按热度按时间mf98qq941#
@XmlElement(name = "ParticipantBinding")
annotation可能会干扰@com.fasterxml.jackson.annotation.JsonProperty("participantBindings")
annotation。您是否可以验证ObjectMapper
bean是否在运行时注册了模块JaxbAnnotationModule
?您可以通过
@Autowire
-ing任何类中的ObjectMapper并在调用该类中的方法时调试ObjectMapper来检查这一点。如果ObjectMapper确实注册了该模块(我猜它已经注册了,因为您可能还使用它将对象序列化为XML),您可能希望为不同的媒体类型注册单独的MessageConverters(每个都有一个单独的ObjectMapper)。