2015-09-17 3 views
1

Я имел этот код работает отлично с EclipseLink 2.5.2, но переход к 2.6.0 Перерывы XmlValue аннотацию:использование Марка из @XmlValue в подклассе

Свойство или Значение поля не может быть аннотированный с XmlValue так это подкласс другого класса, связанного с XML.

Базовый класс выглядеть следующим образом:

public abstract class Baseclass { 

    @XmlAttribute 
    private String baseValue; 

    // ... 
} 

Один из двух подклассов (композитная модель, класс B может иметь список элементов BaseClass):

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

    @XmlValue 
    private String aValue; 

} 

И использование:

public class Root { 

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

} 

К сожалению, макет класса не может быть изменен, потому что JPA сохраняется в базе данных. Я попытался обернуть классы A и B XmlJavaTypeAdapter без успеха.
Можно ли использовать аннотацию так же, как и раньше, с помощью EL 2.6 или через класс адаптера?

+0

Вы пытались добавить в «Корневую» аннотацию '@ XmlSeeAlso', указав конкретные классы? – Xstian

ответ

3

Мне удалось решить проблему с помощью XmlAdapter.

В подклассе заменить XmlValue аннотацию:

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

И реализации адаптера:

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); 
    } 
} 

XmlPath(".") сделал трюк. Без него маршаллированный XML по-прежнему имеет значение aValue, завернутое в узлы <aValue>.