2015-03-02 147 views
0

我有两个类:使用@XmlTransient只在某些情况下

public class A implements Serializable { 
    ... 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fieldID") 
    private Collection<B> bCollection; 
    ... 
    public Collection<B> getBCollection() 
    { 
     return bCollection; 
    } 
    public void setBCollection(Collection<B> bCollection) 
    { 
     this.bCollection = bCollection; 
    } 
} 

public class B implements Serializable { 
    ... 
    @JoinColumn(name = "aID", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private A aID; 
    ... 
    @XmlTransient 
    public A getAID() { 
     return aID; 
    } 
    public void setAID(A aID) { 
     this.aID= aID; 
    } 
} 

我总是用A类 - 它正在为inteded,但现在,我想用B类的RESTful GET方法。但是,当我尝试这样做时,@XmlTransient禁止显示A字段。是否有可能在A类上使用@XmlTransient,当我使用B类时,在B类上使用它,当我使用A类时?

回答

1

一个简单的解决方案是包括https://eclipse.org/eclipselink/moxy.php并开始使用@XmlInverseReference注解用于双向依赖性。 http://eclipse.org/eclipselink/api/2.2/org/eclipse/persistence/oxm/annotations/XmlInverseReference.html

如果这是不可能,请提供JAXB/JAX-RS实现您正在使用能够拿出你的问题的一些更具体的解决方案的更多信息。

一般来说,这个想法是控制序列化过程,并决定如何对某些对象/字段进行序列化,以及是否应该序列化这些对象/字段。例如,它可以实现与以下策略:

  1. 序列化B类不是整个物体,而仅仅是作为它的字符串表示,当A类是序列化。例如使用@XmlAttribute @XmlIDREF。通过设置,例如

  2. 控制序列化过程中,某种过滤器/排除的(这取决于什么是您的JAX-RS的实现提供):

    ExclusionStrategy() { 
    
        public boolean shouldSkipClass(Class<?> clazz) { 
         return (clazz == B.class); 
        } 
    
        /** 
         * Custom field exclusion goes here 
         */ 
        public boolean shouldSkipField(FieldAttributes f) { 
         return false; 
        } 
    
    } 
    
相关问题