【问题标题】:Jersey loses id field泽西岛丢失 id 字段
【发布时间】:2012-05-08 04:37:00
【问题描述】:

我使用 Jersey 作为 JSR 311 实现。我试图转换为 JSON 的对象如下所示:

@XmlRootElement
public class deliveryTimes{
  private Integer id;
  private Short type;
  private Integer orderId;
  /* ... more fields and autogenerated Getters & Setters ... */
}

JSON 结果是:

{"deliveryTimes":
[{"type":"1","orderId":"30449",/* ... other fields ... */ },
/* ... */
]}

换句话说:“id”字段正在丢失。在我的其他对象中,id 字段具有其他名称,例如 orderId、customerId ......并且这些字段不会丢失。

我的 pom.xml 看起来像这样:

<!-- other stuff -->
<!--  JERSEY -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-grizzly2</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.11</version>
</dependency>

<!-- Jersey + Spring -->
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-spring</artifactId>
    <version>1.11</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- other stuff -->

没有进一步的配置。 我在球衣网站或谷歌上没有找到任何有用的东西,所以我在这里发布了我的第一篇文章。

我缺少任何配置选项吗?你如何 JSONify id-fields?

【问题讨论】:

    标签: java spring jersey jsr311


    【解决方案1】:

    id 可能无法编组的原因有很多。

    1 - 它有一个空值

    默认情况下,JAXB 实现不会封送空值。如果您希望编组一个空值,请务必添加以下注释

    @XmlElement(nillable=true)
    

    欲了解更多信息,请参阅:

    2 - 有一个字段但不是没有访问器(get/set)方法

    默认情况下,JAXB 只映射公共字段和访问器。不符合此条件的任何内容都被视为未映射。你可以通过指定XmlAccessorType(XmlAccessType.FIELD)来解决这个问题

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class deliveryTimes{
        ...
    }
    

    或通过注释字段

    @XmlRootElement
    public class deliveryTimes{
        @XmlElement
        private Integer id;
    }
    

    欲了解更多信息,请参阅:

    3 - 有get方法但没有set方法

    如果有 get 方法但没有附带的 set 方法,那么您的 JAXB 实现会将其视为未映射的属性。要解决此问题,您只需将 get 方法映射到 @XmlElement

    【讨论】:

    • 感谢您的回答。实际上,我正在寻找一种分发空值的方法(您在 #1 中猜对了)并将“id”的数据类型从 int 更改为 Integer,但忘记了 setter。下次我会让 IDE 重构它。再次感谢您提供详细的有用答案(如果我有足够的声誉,我会 +1)!
    【解决方案2】:

    “id”没有什么特别之处。从您班级的@XmlRootElement 来看,我假设您正在使用 JAXB 进行编组(Jersey 的默认设置)。在默认配置中,JAXB 需要一个 getter 将字段编组为 XML/JSON,并需要一个 setter 将字段从 XML/JSON 解组。在这种情况下,我猜你缺少 public Integer getId() 方法。您可以通过将 @XmlElement 添加到您的 id 字段来轻松更改此行为。

    【讨论】:

    • 或者,如果没有属性可以使用@XmlAccessorType(XmlAccessType.FIELD)
    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2017-05-13
    • 2013-12-21
    • 1970-01-01
    • 2011-10-14
    • 2019-03-13
    相关资源
    最近更新 更多