Jackson could not consider @XmlElement when serializing in JSON

I have a contract class that contains elements with @XmlElement tags. For ex

@XmlElement(name = "balancemoney") protected Amount balanceMoney; 

Using JAXBContext, I can generate xml with the appropriate tags.

However, when I use the library provided by Jackson, the JSON tag is still used as "balanceMoney" instead of "balancemoney"

How to tell Jackson to consider the @XmlElement tag.

Below is the code that does this.

  //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)); } 
+3
source share
2 answers

According to Using JAXB Annotations with Jackson : To enable JAXB annotation support , you need to set mapper.getDeserializationConfig().setAnnotationIntrospector(new JaxbAnnotationIntrospector()); to allow Jackson to use the JAXB annotation.

+3
source
  • Maven dependency - pom.xml:

     <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.6.1</version> </dependency> 
  • Custom ObjectMapper configuration (uncomment all annotations to register this default mapper in 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; } } 
  • Code to display as JSON:

     public void displayJSON(Object reqResp) throws JsonProcessingException{ ObjectMapper mapper = JacksonConfig.createCustomObjectMapper(); LOG.info(mapper.writeValueAsString(reqResp)); } 
+1
source

All Articles