Glassfish 4.1 — веб-сервис JSON с EclipseLink и MOXy: проблемы с дублированием @EmbeddedId

Я использую GlassFish 4.1 (NetBeans), EclipseLink и привязку MOXy json по умолчанию.

У меня есть объект с составным первичным ключом. Мне нужна плоская структура json как для ввода, так и для вывода. Вроде прямо, но...

Если я ничего особенного не делаю, при маршаллинге я получаю сглаженный json, но демаршаллинг не работает (key = null).

Если я добавляю аннотацию @XmlPath("."), то все наоборот: десортировка работает, но ключевые поля дублируются в json.

Кроме того, MOXy, кажется, добавляет поле type в json, о котором я никогда не спрашивал.

Классы сущностей:

ПК:

@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"
    }
]

Но демаршаллинг работает правильно.

Любая идея, ребята?


person Derlin    schedule 05.07.2016    source источник


Ответы (1)


Хорошо, для тех, у кого такая же проблема, я наконец-то заменил @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
person Derlin    schedule 06.07.2016