2016-06-09 6 views
5

Ich erhalte folgende Fehlermeldung, ich habe Status-Klasse, aber es wird nicht erkannt. Ich habe keine Ahnung, wie es weitergehen soll und konnte keine Antwort online finden.verursacht durch: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unbekanntes Feld "Status"

Fehler

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; 

    ..... 

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

Antwort

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

Ich habe folgendes-Status, aber ich bin immer noch die gleichen Fehler zu empfangen.

+1

Haben Sie ein Beispiel für Ihre XML? –

+0

@MattPearce ja gerade in Frage gestellt. –

+0

können Sie den gesamten Stacktrace –

Antwort

1

Sie haben zwei Möglichkeiten, vorausgesetzt Sie verwenden Jackson, um Ihre XML-Objekte zu deserialisieren. Am einfachsten ist es, Jacksons eigene XML-Annotationen anstelle von oder genauso gut wie die JAXB @XmlElement Annotationen zu verwenden. Zum Beispiel:

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

(Die @XmlElement Anmerkung ist in dem jackson-dataformat-xml Paket in Maven - die Version sollte Ihre andere Jackson Paketversionen entsprechen.)

Die Alternative ist ein AnnotationIntrospector als Teil Ihrer Deserialisierung Kette registrieren - dh (aus einem Komponententest):

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

Dies erkennt die @XmlElement Annotation. Weitere Details finden Sie in this answer, wenn Sie dies beispielsweise als Teil einer Spring-Konfiguration angeben müssen.

(Um die JaxbAnnotationIntrospector Klasse zu verwenden, müssen Sie das jackson-module-jaxb-annotation Modul von Maven.)

+0

danke, ich habe die Annotation hinzugefügt, die Sie vorgeschlagen haben, aber es scheint, dass ich eine andere Abhängigkeit von dem verwende, was Sie verwenden. Wie die IDE sagt, kann jacksonXmlProperty nicht in einen Typ aufgelöst werden. Warum erkennt mein Code Status? Warum sollte ich JacksonXmlProperty verwenden? –

+0

Ich habe einige Hinweise zu den Abhängigkeiten hinzugefügt. Jackson 2.x unterstützt die Standard-JAXB-Annotationen nicht standardmäßig - siehe ihre Wiki-Seite (http://wiki.fasterxml.com/JacksonJAXBAnnotations) für weitere Details. –

+0

Ich folgte Ihrer ersten Lösung, aber der Code gibt immer noch folgenden Fehler zurück. org.springframework.http.converter.HttpMessageNotReadableException: Konnte JSON nicht lesen: Unbekanntes Feld "Status" (Klasse com.myproject.ticket.EventsResponse), nicht als ignorierbar gekennzeichnet (3 bekannte Eigenschaften: "events", "status", "page "]) Frage wird aktualisiert. –

3

ich Ihr Problem zu rekonstruieren ist fehlgeschlagen.

Ich erstellte ein Testprojekt github here, das Jackson-Konfiguration und JAXB-Anmerkungen hat, die Ihre Bedürfnisse erfüllen.

Ich habe Abhängigkeiten jackson-Datenformat-xml und Woodstox-Core-asl als Stax-Implementierungen (in meinem Test-Projekt, das ich bin mit Jackson 2.6.6., Frühling 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> 

konfigurieren der Jackson2ObjectMapperBuilder, um sowohl Jackson- als auch JAXB-Annotationen zu verwenden.Dies ist ein Feder Boot Beispiel einfache Feder-MVC aussehen 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; 
} 
} 

Beachten Sie die Verwendung von

PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE 

es erspart Ihnen die Notwendigkeit angeben alternative Benennung für Anfangsbuchstaben Kapitalisierung zu konvertieren und wird erfordern die Verwendung für JAXB Annotation nur für Warping und Umbenennung beispielsweise meine EventsResponse wird wie folgt aussehen:

Verwandte Themen