2015-01-04 2 views
2

имея это определение JAXB Xml, я стараюсь, чтобы удалить элементы карты Wrapper путем добавления @XmlPath("."), но это может вызвать исключение во время unmarchaling@XmlPath («») конфликты с @XmlAdapter

@XmlRootElement 
public abstract class ViewElement{ 
    @XmlJavaTypeAdapter(value=EventAdapter.class) 
    public Map<Event, String> getEvents() {  
    } 
    private transient Class entityType; 
    public Class getEntityType() { 
     return entityType; 
    } 
} 

И EventAdapter является

public class EventAdapter extends XmlAdapter<EventAdapter.AdaptedMap, Map<Event, String>> { 
    public static class AdaptedMap { 
     @XmlVariableNode("key") 
     List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>(); 
    } 
    public static class AdaptedEntry { 
     @XmlTransient 
     public String key; 
     @XmlValue 
     public String value; 
    } 
    .....  
} 

мой выход был

<element> 
    <events> 
     <onCellEdit>do some thing<onCellEdit> 
    </events> 
    <entityType>com.agitech.erp.model.erp.ErpFolder</entityType> 
<element> 

Я пытаюсь удалить <events> тег путем добавления @XmlPath(".")

@XmlPath(".") 
@XmlJavaTypeAdapter(value=EventAdapter.class) 
public Map<Event, String> getEvents() {  
} 

Выход хороший

но unmarchaling faileds

Caused by: Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.6.0.v20140809-296a69f): org.eclipse.persistence.exceptions.ConversionException 
Exception Description: The object [], of class [class java.lang.String], from mapping [org.eclipse.persistence.oxm.mappings.XMLDirectMapping[entityType-->view.entityType/text()]] with descriptor [XMLDescriptor(com.agitech.erp.view.BeanView --> [DatabaseTable(view), DatabaseTable(viewFrame), DatabaseTable(viewElement)])], could not be converted to [class java.lang.Class]. 
Internal Exception: java.lang.ClassNotFoundException: 
    at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConvertedToClass(ConversionException.java:95) 
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToClass(ConversionManager.java:446) 

JAXB отладки привести меня к линии

org.eclipse.persistence.internal.oxm.XMLDirectMappingNodeValue 

public void endElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord) { 
    ... 
    line 205 unmarshalRecord.setAttributeValue(convertedValue, xmlDirectMapping); 
} 

В unmarchaling значения EntityType, то UnmarshalRecordImpl.currentObj содержит EventAdapter вместо родительского элемента

я изменить org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl

public XPathNode getNonAttributeXPathNode(String namespaceURI, String localName, String qName, Attributes attributes) { 
.... 
    if(null == resultNode && null == nonPredicateNode) { 
     // ANY MAPPING 
     resultNode = xPathNode.getAnyNode(); 
// by default it return the EventAdapter, changing it to NULL fix my problem 
    } 
.... 
} 

Не безопасное решение

ответ

0

Я был в состоянии воспроизвести проблему что вы видите, но еще не разработали причину. Вы можете использовать следующую ошибку, чтобы отслеживать прогресс в этом вопросе:

+0

Спасибо за ваше внимание, я добавить более тестовый случай, и в комментарии мой текущий небезопасным рабочий раствор –

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