2016-06-09 73 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

可以提供整个堆栈跟踪 –

回答

1

假设您使用Jackson反序列化XML对象,您有两种选择。最简单的方法是使用Jackson自己的XML注释,而不是JAXB @XmlElement注释。例如:

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

(该@XmlElement注释是在jackson-dataformat-xml包Maven中 - 的版本应该与其他杰克逊包版本)

另一种方法是注册一个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注释。例如,如果您需要将其作为Spring配置的一部分包含在内,则可以在this answer中找到更多详细信息。

(为了使用JaxbAnnotationIntrospector类,您将需要的Maven的jackson-module-jaxb-annotation模块。)

+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个已知属性:“events”,“status”,“page “])问题已更新。 –

3

我没能重建您的问题。

我创建了一个测试项目github here,它具有满足您需求的Jackson配置和JAXB注释。

我添加依赖于杰克逊DATAFORMAT-xml和woodstox核-ASL为您的StAX实现(在我的测试项目中,我使用杰克逊2.6.6,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; 
    ... 
}