我有一个合约类,其中包含带有 @XmlElement 标签的元素。对于前
@XmlElement(name = "balancemoney")
protected Amount balanceMoney;
使用 JAXBContext 我能够生成带有正确标签的 xml。
但是,当我使用 jackson 提供的库时,JSON 标记仍然以“balanceMoney”而不是“balancemoney”形式出现
我如何告诉 Jackson 考虑 @XmlElement 标签。
下面是执行此操作的代码。
//Function to display request object.
public void displayXML(Object reqResp){
try{
JAXBContext jaxbContext = JAXBContext.newInstance(reqResp.getClass());
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
ByteArrayOutputStream bStream=new ByteArrayOutputStream();
//jaxbMarshaller.marshal(reqResp, System.out);
jaxbMarshaller.marshal(reqResp,bStream );
logger.info(bStream.toString());
}catch(JAXBException e){
logger.info(e.getMessage());
}
logger.info("*** Payload is: " + reqResp.toString());
}
//Function to display as JSON
public void displayJSON(Object reqResp) throws JsonGenerationException, JsonMappingException, IOException{
ObjectMapper mapper = new ObjectMapper();
logger.info(mapper.defaultPrettyPrintingWriter().writeValueAsString(reqResp));
}
Maven 依赖项 - pom.xml:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.6.1</version>
</dependency>
自定义ObjectMapper配置(取消注释所有注释以将此映射器注册为Spring中的默认值):
//@Configuration
public class JacksonConfig {
//@Primary
//@Bean
public static ObjectMapper createCustomObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector();
// first Jaxb, second Jackson annotations
mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson));
return mapper;
}
}
显示为 JSON 的代码:
public void displayJSON(Object reqResp) throws JsonProcessingException{
ObjectMapper mapper = JacksonConfig.createCustomObjectMapper();
LOG.info(mapper.writeValueAsString(reqResp));
}
根据在 Jackson 中使用 JAXB 注解:启用 JAXB 注解支持,您需要设置
mapper.getDeserializationConfig().setAnnotationIntrospector(new JaxbAnnotationIntrospector());
以使 Jackson 能够使用 JAXB 注解。
如果我们在 Jaxbclasses 中从 Javax 迁移到 Jakarta,那么下面应该可以工作
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(new JakartaXmlBindAnnotationModule());