Unmarshalling JAXB collection при использовании IDResolver не удается, потому что IDResolver Object в качестве целевого типа - PullRequest
6 голосов
/ 20 сентября 2011

У меня возникла эта проблема при попытке демонтировать json из остальных веб-сервисов (cxf). Я использую JAXB и EclipseLink.

Сущность отображается так:

@Entity
@Table(name = "service_pkg_service", schema = "MD")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ServicePkgService extends DatabaseModel implements java.io.Serializable {

    @Transient
    @XmlIDREF
    private Set<ChannelPkgService> channelPkgServices = new HashSet<ChannelPkgService>();
}

@Entity
@Table(name = "channel_pkg_service", schema = "MD")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class ChannelPkgService extends DatabaseModel  implements java.io.Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CHANNEL_PKG_ID")
    @XmlID
    @XmlAttribute
    private String id;

}

У меня есть класс, расширяющий IDResolver, поэтому я могу сгенерировать объект на основе его ID.

public class EntityIDResolver extends IDResolver{

@Override
public void bind(String id, Object obj) throws SAXException {
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Callable<?> resolve(final String id, Class targetType) throws SAXException {

    }
}

У меня проблема с демаршалингом json, например, "channelPkgService": [1,2,3], класс targetType - java.lang.Object

Я прочитал это https://github.com/javaee/jaxb-v2/issues/546 и создал оболочку для обработки этого.

public class ChannelPkgServiceWrapper extends HashSet<ChannelPkgService>{
}

Так как у меня много таких случаев, и я не хочу создавать много оберток, есть ли более общий способ справиться с этим?

Забудьте об использованных версиях:

  • cxf.version: 2.3.6
  • EclipseLink: 2.3.0
  • JAXB-осущ-2.1.13.jar (банка, содержащая Lister.class, который выполняет фактическую работу для получения правильного типа.)

1 Ответ

1 голос
/ 20 сентября 2011

@XmlIDREF используется JAXB для сопоставления ссылок внутри документа. Каждый объект, на который ссылается ID, также должен появляться где-то в документе XML или JSON:

Если вы хотите маршалировать объект в качестве его идентификатора, вы можете использовать XmlAdapter. Проверьте мой ответ на подобный вопрос:

Также обратите внимание, что JAXB является спецификацией ( JSR-222 ), а EclipseLink содержит MOXy реализация (я МОКСИ технический руководитель). Это означает, что вы можете исключить jaxb-impl-2.1.13.jar из ваших зависимостей:

...