开发者

Unmarshalling JAXB collection when using IDResolver failing because IDResolver Object as target type

I have this problem trying to unmarshall json from rest webservice (cxf). I'm using JAXB and EclipseLink.

The entity is mapped like that:

@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;

}

I have a class extending IDResolver, so I can generate an entity based on its 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 {

    }
}
开发者_如何学Go

I have problem unmarshalling json like this "channelPkgService": [1,2,3], the class of targetType is java.lang.Object

I read this https://github.com/javaee/jaxb-v2/issues/546 , and created a wrapper to handle this.

public class ChannelPkgServiceWrapper extends HashSet<ChannelPkgService>{
}

Sinse I have a lot of these cases and I don't want to create a lot of wrappers, is there a more generic way to handle that?

Forget the used versions:

  • cxf.version:2.3.6
  • eclipselink:2.3.0
  • jaxb-impl-2.1.13.jar (jar containing Lister.class that is doing the actual work for getting the correct type.)


@XmlIDREF is used by JAXB to map intra-document references. Each object referenced by ID must also appear nested somewhere in the XML or JSON document:

  • http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html

If you are looking to marshal an object as its ID, then you will want to use an XmlAdapter. Check out my answer to a similar question:

  • Serialize a JAXB object via its ID?

Also note that JAXB is a specification (JSR-222), and EclipseLink contains the MOXy implementation (I'm the MOXy tech lead). This means you could eliminate jaxb-impl-2.1.13.jar from your dependencies:

  • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜