2016-06-09 11 views
5

Otrzymuję następujący komunikat o błędzie, mam klasę statusu, ale nie jest ona rozpoznawana. Nie mam pojęcia, jak postępować i nie mogę znaleźć odpowiedzi w Internecie.Powodowane przez: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Nierozpoznane pole "Status"

błąd

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; 

    ..... 

stanu

@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; 

Odpowiedź

<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> 

Dodałem następujący status, ale nadal otrzymuję ten sam błąd.

+1

Czy masz przykład swojego XML? –

+0

@MattPearce yes just included in question. –

+0

możesz podać cały stacktrace –

Odpowiedz

1

Masz dwie opcje, zakładając, że używasz Jacksona do deserializacji obiektów XML. Najprostsze jest użycie własnych adnotacji XML Jacksona zamiast lub obok adnotacji JAXB @XmlElement. Na przykład:

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

(@XmlElement adnotacja znajduje się w opakowaniu w Maven jackson-dataformat-xml - wersja powinna dopasować swoje inne wersje pakietu Jackson).

Alternatywą jest zarejestrowanie AnnotationIntrospector jako część łańcucha deserializacji - tj. (z testu jednostkowego):

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); 

Rozpoznaje to adnotację @XmlElement. Więcej szczegółów w this answer, jeśli chcesz uwzględnić to jako część konfiguracji Spring, na przykład.

(Aby użyć klasy JaxbAnnotationIntrospector, trzeba będzie moduł z Maven jackson-module-jaxb-annotation).

+0

dzięki, dodałem adnotację, którą zasugerowałeś, ale wydaje się, że używam innej zależności od tego, z czego korzystasz. Ponieważ IDE mówi, że jacksonXmlProperty nie może być rozwiązany na typ. Dlaczego mój kod rozpoznaje status? dlaczego powinienem używać JacksonXmlProperty? –

+0

Dodałem kilka uwag o wymaganych zależnościach. Jackson 2.x nie obsługuje domyślnych adnotacji JAXB po wyjęciu z pudełka - zobacz ich stronę wiki (http://wiki.fasterxml.com/JacksonJAXBAnnotations), aby uzyskać więcej szczegółów. –

+0

Poszedłem za twoim pierwszym rozwiązaniem, ale kod nadal zwraca następujący błąd. org.springframework.http.converter.HttpMessageNotReadableException: Nie można odczytać JSON: Nierozpoznane pole "Status" (klasa com.myproject.ticket.EventsResponse), nie oznaczono jako niezadowalające (3 znane właściwości: "zdarzenia", "stan", "strona" "]) Pytanie zostało zaktualizowane. –

3

nie udało mi się odtworzyć problem.

Utworzono projekt testowy github here, który ma konfigurację Jackson i adnotacje JAXB, które spełniają Twoje potrzeby.

dodałem zależności Jackson-dataFormat-xml i woodstox-core-npm jako swoich implementacjach Stax (w moim projekcie badania używam Jackson 2.6.6., Wiosna 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> 

Konfiguracja Jackson2ObjectMapperBuilder do używania adnotacji Jackson i JAXB.Jest to przykład Wiosna-boot do konwersji proste wiosna-MVC wyglądać 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; 
} 
} 

Zauważ użycie

PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE 

to zaoszczędzić konieczność określenia alternatywnego nazewnictwa dla pierwszej litery kapitalizacji i woli wymagają użycia adnotacji JAXB tylko do wypaczenia i zmiany nazwy, na przykład moja EventResponse będzie wyglądać następująco:

@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; 
    ... 
} 
Powiązane problemy