2016-06-09 2 views
5

Я получаю следующее сообщение об ошибке, у меня есть класс состояния, но он не распознается. Я понятия не имею, как действовать дальше и не смог найти ответ в Интернете.Вызвано: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Нераспознанное поле «Статус»

Ошибка

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; 

    ..... 

Статус

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

Ответ

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

Я добавил следующее положение, но я все еще получаю ту же ошибку.

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

у вас есть пример вашего XML? –

+0

@MattPearce да только включено в вопрос. –

+0

Можете ли вы предоставить весь stacktrace –

ответ

1

У вас есть два варианта, если вы используете Джексон для десериализации объектов XML. Простейшим является использование собственных аннотаций Джэксона, а не аннотаций JAXB @XmlElement. Например:

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

(@XmlElement аннотаций находятся в jackson-dataformat-xml пакете в Maven - версия должна соответствовать вашим другим версиям пакета Jackson.)

Альтернативой является регистрация AnnotationIntrospector как часть вашей десериализации цепи - т.е. (От модульного теста):

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

Это признает @XmlElement аннотацию. Более подробную информацию можно найти в this answer, если вам нужно включить это как часть конфигурации Spring, например.

(Для того, чтобы использовать JaxbAnnotationIntrospector класс, вам потребуется jackson-module-jaxb-annotation модуль из Maven.)

+0

спасибо, я добавил предложенную вами аннотацию, но, похоже, я использую другую зависимость от того, что вы используете. Поскольку IDE говорит, что jacksonXmlProperty не может быть разрешен к типу. Почему мой код распознает статус? почему я должен использовать JacksonXmlProperty? –

+0

Я добавил несколько заметок о необходимых зависимостях. Jackson 2.x не поддерживает аннотации JAXB по умолчанию из коробки - см. Их страницу wiki (http://wiki.fasterxml.com/JacksonJAXBAnnotations) для получения дополнительной информации. –

+0

Я выполнил ваше первое решение, но код по-прежнему возвращает следующую ошибку. org.springframework.http.converter.HttpMessageNotReadableException: не удалось прочитать JSON: нераспознанное поле «Status» (класс com.myproject.ticket.EventsResponse), не помеченное как невежественное (3 известных свойства: «события», «статус», «страница "]) Вопрос обновляется. –

3

я не смог восстановить свой вопрос.

Я создал тестовый проект github here, который имеет конфигурацию Джексона и аннотации JAXB, которые отвечают вашим потребностям.

Я добавил зависимости Джексону-DataFormat-XML и Woodstox-колонкового над уровнем моря, как ваши реализации Stax (в моем тестовом проекте я использую Джексон 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> 

Настройка Jackson2ObjectMapperBuilder для использования аннотаций Jackson и JAXB.Это пример Spring-загрузки, чтобы преобразовать в простой весна-MVC выглядеть 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; 
} 
} 

Обратите внимание на использование

PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE 

это сэкономит вам необходимо указать альтернативное именование для первой буквы капитализации и будет требуют использования для JAXB аннотации только для коробления и переименования, например, мой EventsResponse будет выглядеть следующим образом:

@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; 
    ... 
} 
Смежные вопросы