有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是由:com引起的。fasterxml。杰克逊。数据绑定。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"])

事件响应

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

共 (2) 个答案

  1. # 1 楼答案

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

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

    (Maven中的@XmlElement注释位于jackson-dataformat-xml包中-版本应与其他Jackson包版本匹配。)

    另一种方法是注册一个AnnotationInvestor作为反序列化链的一部分,即(从单元测试中):

        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模块。)

  2. # 2 楼答案

    我没能重建你的问题

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

    我向jackson dataformat xml和woodstox core asl添加了依赖项,作为您的Stax实现(在我的测试项目中,我使用的是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>
    

    将Jackson2ObjectMapperBuilder配置为同时使用Jackson和JAXB注释。这是一个Spring引导示例,可以转换为简单的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注释,例如my Events Response将如下所示:

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