使用IDResolver失败时解组JAXB集合,因为IDResolver对象是目标类型

Man*_*iev 6 java cxf jaxb

我有这个问题试图从休息webservice(cxf)unmarshall json.我正在使用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;

}
Run Code Online (Sandbox Code Playgroud)

我有一个扩展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 {

    }
}
Run Code Online (Sandbox Code Playgroud)

我有问题解组json像这个"channelPkgService":[1,2,3],targetType的类是java.lang.Object

我读了这篇https://github.com/javaee/jaxb-v2/issues/546,并创建了一个包装来处理这个问题.

public class ChannelPkgServiceWrapper extends HashSet<ChannelPkgService>{
}
Run Code Online (Sandbox Code Playgroud)

Sinse我有很多这些情况,我不想创建很多包装器,是否有更通用的方法来处理它?

忘记使用的版本:

  • cxf.version:2.3.6
  • 的EclipseLink:2.3.0
  • jaxb-impl-2.1.13.jar(包含Lister.class的jar,它正在执行实际工作以获取正确的类型.)

bdo*_*han 1

@XmlIDREFJAXB 使用它来映射文档内引用。ID 引用的每个对象还必须嵌套在 XML 或 JSON 文档中的某个位置:

如果您希望将一个对象编组为其 ID,那么您将需要使用XmlAdapter. 看看我对类似问题的回答:

另请注意,JAXB 是一个规范 ( JSR-222 ),并且EclipseLink包含MOXy实现(我是 MOXy 技术负责人)。这意味着您可以从依赖项中删除 jaxb-impl-2.1.13.jar: