Spring Boot JacksonJAXB在使用XMLProperty和XMLElementWrapper注解时忽略JSONProperty

t1rydlwq  于 2023-04-20  发布在  Spring
关注(0)|答案(1)|浏览(197)

我有一个字段,我希望在使用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" : [ ...]
mf98qq94

mf98qq941#

@XmlElement(name = "ParticipantBinding") annotation可能会干扰@com.fasterxml.jackson.annotation.JsonProperty("participantBindings") annotation。您是否可以验证ObjectMapper bean是否在运行时注册了模块JaxbAnnotationModule
您可以通过@Autowire-ing任何类中的ObjectMapper并在调用该类中的方法时调试ObjectMapper来检查这一点。
如果ObjectMapper确实注册了该模块(我猜它已经注册了,因为您可能还使用它将对象序列化为XML),您可能希望为不同的媒体类型注册单独的MessageConverters(每个都有一个单独的ObjectMapper)。

相关问题