2015-09-17 2 views
1

J'ai eu ce code fonctionne bien avec EclipseLink 2.5.2, mais passer à 2.6.0 breaks l'annotation XmlValue:Faire usage de @XmlValue dans la sous-classe

La propriété ou la valeur du champ ne peut pas être annotés avec XMLValue depuis c'est une sous-classe d'une autre classe liée au XML.

look classe de base comme ceci:

public abstract class Baseclass { 

    @XmlAttribute 
    private String baseValue; 

    // ... 
} 

L'une des deux sous-classes (motif composite, classe B peut avoir une liste d'éléments BaseClass):

@XmlRootElement(name = "A") 
public class A extends BaseClass { 

    @XmlValue 
    private String aValue; 

} 

Et l'utilisation:

public class Root { 

    @XmlElements({ 
      @XmlElement(class = A.class), 
      @XmlElement(class = B.class) 
    }) 
    private BaseClass object; 

} 

Malheureusement, la présentation de la classe ne peut pas être changé, parce que JPA a persisté dans une base de données. J'ai essayé d'envelopper les classes A et B avec un XmlJavaTypeAdapter sans succès.
Est-il possible d'utiliser l'annotation comme précédemment avec EL 2.6 ou via une classe d'adaptateur?

+0

Avez-vous essayé d'ajouter à 'Root' l'annotation' @ XmlSeeAlso' spécifiant les classes concrètes? – Xstian

Répondre

3

J'ai réussi à résoudre le problème en utilisant un XmlAdapter.

Dans la sous-classe remplace l'annotation XMLValue:

@XmlPath(".") 
@XmlJavaTypeAdapter(AClassAdapter.class) 
private String aValue; 

Et la mise en œuvre de l'adaptateur:

public class AClassAdapter extends XmlAdapter<AdaptedValue, String> { 

    public static class AdaptedValue { 

     @XmlValue 
     public String value; 

     public AdaptedValue() { 
     } 

     public AdaptedValue(String value) { 
      this.value = value; 
     } 
    } 

    @Override 
    public String unmarshal(AdaptedValue v) throws Exception { 
     return v.value; 
    } 

    @Override 
    public AdaptedValue marshal(String v) throws Exception { 
     return new AdaptedValue(v); 
    } 
} 

Le XmlPath(".") a fait l'affaire. Sans cela, le XML marshalled a toujours la valeur de aValue enveloppé dans <aValue> nœuds.