通过它的ID序列化一个JAXB对象? [英] Serialize a JAXB object via its ID?
问题描述
在我的数据模型中,我有这样的效果:
@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屋!