通过它的ID序列化一个JAXB对象? [英] Serialize a JAXB object via its ID?

查看:89
本文介绍了通过它的ID序列化一个JAXB对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的数据模型中,我有这样的效果:

  @Entity 
public class Target { b
$ b @Id
@GeneratedValue
私人长ID;

/ * ... etc ... * /
}

@实体
公共类别依赖关系{

@Id
@GeneratedValue
私人长ID;

@ManyToOne(可选= false)
@Column(name =target_id)
私人目标目标;

/ * ... etc ... * /
}

我已经序列化 Target 就好了,但我需要序列化 Dependency 。基本上,我需要的是这样的:

 <依赖关系> 
< id> 100< / id>
< targetId> 200< / targetId>
< /依赖关系>

有没有办法在不修改模型的情况下在JAXB注释中执行此操作?

  package forum7278406; 

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class TargetAdapter extends XmlAdapter< Long,Target> {

@Override
public Long marshal(Target target)抛出异常{
return target.getId();

$ b @Override
public target unmarshal(Long id)throws Exception {
Target target = new Target();
target.setId(id);
回报目标;


$ b $ / code>

使用 @XmlJavaTypeAdapter 注释在 Dependency 类中注册XmlAdapter

  package forum7278406; 

import javax.persistence。*;
import javax.xml.bind.annotation。*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Dependency {

@Id
@ GeneratedValue
私人长ID;

@ManyToOne(可选= false)
@Column(name =target_id)
@XmlJavaTypeAdapter(TargetAdapter.class)
私有目标目标;

public Long getId(){
return id;
}

public void setId(Long id){
this.id = id;
}

public Target getTarget(){
return target;
}

public void setTarget(Target target){
this.target = target;
}

}






继续

而不是仅创建 Target 我们可以使用 EntityManager 从数据库中查询相应的实例。我们的 XmlAdapter 会被改为:

  package forum7278406; 

导入javax.persistence.EntityManager;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class TargetAdapter extends XmlAdapter< Long,Target> {

EntityManager entityManager;
$ b $ public TargetAdapter(){
}

public TargetAdapter(EntityManager entityManager){
this.entityManager = entityManager;
}

@Override
public Long marshal(Target target)抛出异常{
return target.getId();
}

@Override
public target unmarshal(Long id)throws Exception {
Target target = null;
if(null!= entityManager){
target = entityManager.find(Target.class,id);
}
if(null == target){
target = new Target();
target.setId(id);
}
返回目标;
}

}

现在设置 EntityManager 在我们的 XmlAdapter 上,我们可以做到以下几点:

  Unmarshaller umarshaller = jaxbContext.createUnmarshaller(); 
TargetAdapter targetAdatper = new TargetAdapter(entityManager);
unmarshaller.setAdapter(targetAdapter);


In my data model, I have something to this effect:

@Entity
public class Target {

    @Id 
    @GeneratedValue
    private Long id;

    /* ...etc... */
}

@Entity
public class Dependency {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne(optional=false)
    @Column(name="target_id")
    private Target target;

    /* ...etc... */
}

I'm already serializing Target just fine, but I need to serialize Dependency. Essentially, what I need is something like this:

<dependency>
    <id>100</id>
    <targetId>200</targetId>
</dependency>

Is there a way to do this in JAXB annotations without modifying my model?

解决方案

You could use an XmlAdapter for this use case:

package forum7278406;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class TargetAdapter extends XmlAdapter<Long, Target> {

    @Override
    public Long marshal(Target target) throws Exception {
        return target.getId();
    }

    @Override
    public Target unmarshal(Long id) throws Exception {
        Target target = new Target();
        target.setId(id);
        return target;
    }

}

The XmlAdapter is registered on the Dependency class using the @XmlJavaTypeAdapter annotation:

package forum7278406;

import javax.persistence.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Dependency {

    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne(optional=false)
    @Column(name="target_id")
    @XmlJavaTypeAdapter(TargetAdapter.class)
    private Target target;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Target getTarget() {
        return target;
    }

    public void setTarget(Target target) {
        this.target = target;
    }

}


Going Further

Instead of just creating a new instance of Target we could use an EntityManager to query the corresponding instance from the database. Our XmlAdapter would be changed to look something like:

package forum7278406;

import javax.persistence.EntityManager;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class TargetAdapter extends XmlAdapter<Long, Target> {

    EntityManager entityManager;

    public TargetAdapter() {
    }

    public TargetAdapter(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public Long marshal(Target target) throws Exception {
        return target.getId();
    }

    @Override
    public Target unmarshal(Long id) throws Exception {
        Target target = null;
        if(null != entityManager) {
            target = entityManager.find(Target.class, id);
        }
        if(null == target) {
            target = new Target();
            target.setId(id);
        }
        return target;
    }

}

Now to set the instance of EntityManager on our XmlAdapter, we can do the following:

Unmarshaller umarshaller = jaxbContext.createUnmarshaller();
TargetAdapter targetAdatper = new TargetAdapter(entityManager);
unmarshaller.setAdapter(targetAdapter);

这篇关于通过它的ID序列化一个JAXB对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆