2015-01-04 59 views
2

冲突有这个JAXB XML定义,我尝试通过增加@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); 
} 

时的EntityType值的unmarchaling,该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

我已经能够重现问题你正在看,但还没有找出原因。您可以使用下面的bug跟踪在这个问题上的进展:

+0

谢谢您的考虑,我添加了一个更好的测试案例,并在评论我目前的不安全的工作解决方案 – 2015-01-10 15:54:11