Glassfish 4.1 - JSON 带有 EclipseLink 和 MOXy 的网络服务:@EmbeddedId 重复问题

Glassfish 4.1 - JSON webservice with EclipseLink and MOXy: @EmbeddedId duplication troubles

我使用 GlassFish 4.1 (NetBeans)、EclipseLink 和默认的 MOXy json 绑定。

我有一个带有复合主键的实体。我需要一个 flat json 结构 用于输入和输出。看起来很简单,但是...

如果我没有做任何特别的事情,我会在编组时变平 json,但是 解组不起作用(key = null)。

如果我添加注释 @XmlPath("."),则情况正好相反:解组有效,但关键字段在 json 中 重复

此外,MOXy 似乎在 json 中添加了一个 type 字段,我从未问过。

实体类:

PK:

@Embeddable
public class SensorPk implements Serializable {

    @Column(name = "sensor_id")
    private Integer id;

    @Column(name = "sensor_address")
    @NotNull
    @Size(min = 1, max = 10)
    private String address = ADDRESS_DEFAULT;

    // + getter/setters
}

实体: (@org.eclipse.persistence.oxm.annotations.XmlPath 被评论)

@Entity
@XmlElement
@Table(name = "sensors")
public class Sensor implements Serializable{

    @EmbeddedId
    // @XmlPath(".")
    private SensorPk composedId;

    @Column(name = "sensor_name")
    @Size(min = 1, max = 45)
    private String name;

    // + getter/setters
}

应用配置:

@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends ResourceConfig {

    public ApplicationConfig() {
        packages("ch.derlin.glf.bbdata");
    }
}

我也尝试安装 jackson(1.X 和 2.X),但无法在 glassfish 4 上运行。

没有任何注释的输出:

XML:

<sensors>
   <sensor>
      <address>noaddress</address>
      <id>24</id>
      <name>TEST</name>
   </sensor>
</sensors>

JSON:

[
    {  
       "type":"sensor",
       "address":"noaddress",
       "id":24,
       "name":"TEST MONNEY"
    }
]

很好,但是相同 json 的解组失败:id 和 address 为空。还有,这个类型字段是什么鬼

有注释:

XML:同上。

JSON:

[
    {  
       "type":"sensor",
       "address":"noaddress",
       "id":24,
       "address":"noaddress",
       "id":24,
       "name":"TEST MONNEY"
    }
]

但解组工作正常。

伙计们有什么想法吗?

好的,对于那些有同样问题的人,我终于成功地将 @EmbeddedId 替换为 @IdClass

class SensorPk 保持不变,但 Sensor class 被重写为:

@IdClass(SensorPk.class)
public class Sensor implements Serializable {

    @Column(name = "sensor_id")
    @Id private Integer id;

    @Column(name = "sensor_address")
    @NotNull
    @Size(min = 1, max = 10)
    @Id private String address = ADDRESS_DEFAULT;

    @Column(name = "sensor_name")
    @Size(min = 1, max = 45)
    private String name;
}

变化是:

  • 注解@IdClass加在最上面,
  • SensorPk 字段复制粘贴了注释 @Id