Called: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: unrecognized Status field

I get the following error message, I have a Status class, but it is not recognized. I have no idea how to proceed further and could not find an answer on the Internet.

Error

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "Status" (class com.myproject.ticket.EventsResponse), not marked as ignorable (3 known properties: "events", "status", "page"]) .... Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Status" (class com.myproject.ticket.EventsResponse), not marked as ignorable (3 known properties: "events", "status", "page"]) 

EventsResponse

 @XmlRootElement(name = "EventsResponse") @XmlAccessorType(XmlAccessType.FIELD) public class EventsResponse { @XmlElement(name = "Status") private Status status; @XmlElement(name = "Paging") private Page page; @XmlElementWrapper(name="Events") @XmlElement(name = "Event") private List<Event> events; ..... 

Status

 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Status { @XmlElement(name = "Version") private double version; @XmlElement(name = "TimeStampUtc") private Date timeStampUtc; @XmlElement(name = "Code") private int code; @XmlElement(name = "Message") private String message; @XmlElement(name = "Details") private String details; 

answer

 <EventsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Status> <Version>2.0</Version> <TimeStampUtc>2016-06-11T09:32:21</TimeStampUtc> <Code>0</Code> <Message>Success</Message> <Details /> </Status> <Paging> <PageNumber>1</PageNumber> <PageSize>50</PageSize> <PageResultCount>15</PageResultCount> <TotalResultCount>15</TotalResultCount> <TotalPageCount>1</TotalPageCount> </Paging> <Events> <Event> 

I have added the following to the status, but I am still getting the same error.

 @XmlElement(name = "Status") @JacksonXmlProperty(localName = "Status") private Status status; 
+5
source share
2 answers

I was unable to repair your problem.

I created a github here test project that has Jackson settings and JAXB annotations that meet your needs.

I added dependencies to jackson-dataformat-xml and woodstox-core-asl as your Stax implementations (in my test project I use Jackson 2.6.6., Spring 4.2.6)

 <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>woodstox-core-asl</artifactId> <version>4.4.1</version> </dependency> 

Configure Jackson2ObjectMapperBuilder to use Jackson and JAXB annotations. This is an example of Spring-boot to convert to Simple Spring-MVC look here

 @SpringBootApplication public class EventAppConfiguration { public static void main(String[] args) { SpringApplication.run(EventAppConfiguration.class, args); } @Bean public Jackson2ObjectMapperBuilder jacksonBuilder() { Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder(); b.indentOutput(true) //Enable Introspects for both Jackson and JAXB annotation .annotationIntrospector(introspector()) //Use CamelCase naming .propertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE) .dateFormat(new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss")); return b; } @Bean public AnnotationIntrospector introspector(){ AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); AnnotationIntrospector secondary = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); AnnotationIntrospector pair = AnnotationIntrospector.pair(primary, secondary); return pair; } } 

Pay attention to use

 PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE 

this will save you the trouble of specifying an alternate naming convention for the first letter and require using the JAXB annotation only to warp and rename, for example, my EventResponse will look like this:

 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class EventsResponse { private Status status; @XmlElement(name = "Paging") private Page page; @XmlElementWrapper(name = "Events") @XmlElement(name = "Event") private List<Event> events; ... } 
+3
source

You have two options if you use Jackson to deserialize XML objects. The simplest thing is to use your own XML annotations for Jackson, not JAXB @XmlElement annotations. For instance:

 @XmlElement(name = "Status") @JacksonXmlProperty(localName = "Status") private Status status; 

(The @XmlElement annotation is in the jackson-dataformat-xml package in Maven - the version should match your other versions of the Jackson package.)

An alternative is to register AnnotationIntrospector as part of your deserialization chain - i.e. (from unit test):

  XmlMapper mapper = new XmlMapper(); AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); mapper.setAnnotationIntrospector(aiJaxb); // EVENTS_RESPONSE is the incoming XML EventsResponse response = mapper.readValue(EVENTS_RESPONSE, EventsResponse.class); 

This recognizes the @XmlElement annotation. See this answer for more details if you need to include this as part of the Spring configuration, for example.

(To use the JaxbAnnotationIntrospector class, you need the jackson-module-jaxb-annotation from Maven.)

+1
source

All Articles