2015-09-26 6 views
1

Как выбрать значение атрибута 'name', которое является типом класса PriceEventName в следующем случае, FYI, если я поставил над ним @XmlAttribute это превращается в исключение «ошибка @ XmlAttribute/@ XmlValue должна ссылаться на тип Java, который сопоставляется с текстом в XML». Я смотрю тяжело на Интернет, но я не нашел что-то похожее на мой случай.@ XmlAttribute/@ XmlValue необходимо ссылаться на тип Java, который сопоставляется с текстом в XML

PriceEvent class 

package somepackage 
import ... 
import 
@XmlAccessorType(XmlAccessType.FIELD) 

    public class PriceEvent { 
     @XmlElement(name="Message",namespace="someValue") 
     private String color; 

     private PriceEventName name;// this is an attribute 
     . 
     . 
    } 

класс PriceEventName

Imports ... 

public class PriceEventName { 

    public static final int PRICEUPDATE_TYPE = 0; 
    public static final PriceEventName PRICEUPDATE = new PriceEventName(PRICEUPDATE_TYPE, "X-mas"); 
    private static java.util.Hashtable _memberTable = init(); 
    private static java.util.Hashtable init() { 
     Hashtable members = new Hashtable(); 
     members.put("X-mas", PRICEUPDATE); 
     return members; 
    } 

    private final int type; 
    private java.lang.String stringValue = null; 

     public PriceEventName(final int type, final java.lang.String value) { 
     this.type = type; 
     this.stringValue = value; 
    } 

    public static PriceEventName valueOf(final java.lang.String string) { 
     java.lang.Object obj = null; 
     if (string != null) { 
      obj = _memberTable.get(string); 
     } 
     if (obj == null) { 
      String err = "" + string + " is not a valid PriceEventName"; 
      throw new IllegalArgumentException(err); 
     } 
     return (PriceEventName) obj; 
     } 
} 
+0

Что является ли определение класса Java для PriceEventName? Атрибуты должны иметь такие типы, как String, int, boolean и т. Д., То есть только то, что может быть записано как атрибут XML. Возможно, вам придется определить адаптер. – laune

+0

@peter здесь мы идем, я добавил определение класса, возможно, мне нужно ваше мнение. – poa

+0

Вам нужно будет использовать адаптер, сопоставляющий строку типа «X-mas» с именем PriceEventName и наоборот. – laune

ответ

1

Это, как вы объявить поле как атрибут с адаптером:

@XmlJavaTypeAdapter(PenAdapter.class) 
@XmlAttribute 
protected PriceEventName name; 
public PriceEventName getName() { return name; } 
public void setName(PriceEventName value) { this.name = value; } 

Добавить вам нужно добавить поглотитель к PriceEventName:

public String getStringValue(){ return stringValue; } 

А вот класс адаптера:

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

public class PenAdapter extends XmlAdapter<String,PriceEventName> { 
    public PriceEventName unmarshal(String v) throws Exception { 
     return PriceEventName.valueOf(v); 
    } 
    public String marshal(PriceEventName v) throws Exception { 
     return v.getStringValue(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^