java - 使用 IDResolver 时解码 JAXB 集合失败,因为 IDResolver 对象作为目标类型

标签 java jaxb cxf

我在尝试从 rest web 服务 (cxf) 解码 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;

}

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

既然我有很多这样的情况,我不想创建很多包装器,有没有更通用的方法来处理它?<​​/p>

忘记使用过的版本:

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

最佳答案

@XmlIDREF 被 JAXB 用来映射文档内引用。 ID 引用的每个对象还必须嵌套在 XML 或 JSON 文档中的某处:

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

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

关于java - 使用 IDResolver 时解码 JAXB 集合失败,因为 IDResolver 对象作为目标类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478589/

相关文章:

java - JAXB - xsd :all 内具有无限 maxOccurs 的元素

java - JAXB Unmarshal 未包装的对象列表

java - 使用 Apache CXF 对 SOAP 消息进行签名和加密

java - 在文本文件中添加 double 的代码? java

java - 在 amazon s3 java 中删除文件、目录和存储桶

java - 使用数据库列值到 Date() sqlite android 时出现问题

java - 使用 Apache POI 和 Spring 框架将 Excel 文件上传到数据库

java - JAXB 获取元素的所有内容(标签和文本)

java - 从过滤器序列化 Jersey 异常会引发错误

spring - 使用 REST 根资源类作为接口(interface),得到 "no operation matching request"