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

时间:2016-07-05 11:14:29

标签: json moxy glassfish-4.1

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

我有一个带有复合主键的实体。我需要输入和输出的扁平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都为null。而且,这个类型字段究竟是什么

带注释:

XML:同上。

JSON:

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

但是解组工作正常。

任何想法的人?

1 个答案:

答案 0 :(得分:0)

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

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

@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字段