Jaxb @XmlPath(";)与@XmlAdapter冲突

Jaxb @XmlPath(";)与@XmlAdapter冲突,jaxb,moxy,Jaxb,Moxy,有了这个JAXBXML定义,我尝试通过添加@XmlPath(“.”来删除映射元素包装器,但它会在取消映射过程中导致异常 @XmlRootElement public abstract class ViewElement{ @XmlJavaTypeAdapter(value=EventAdapter.class) public Map<Event, String> getEvents() { } private transient Cla

有了这个JAXBXML定义,我尝试通过添加
@XmlPath(“.”
来删除映射元素包装器,但它会在取消映射过程中导致异常

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

<element>
   <onCellEdit>do some thing<onCellEdit>       
   <entityType>com.agitech.erp.model.erp.ErpFolder</entityType>
<element>
调试Jaxb让我明白了这一点

org.eclipse.persistence.internal.oxm.XMLDirectMappingNodeValue

public void endElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord) {
    ...
    line 205 unmarshalRecord.setAttributeValue(convertedValue, xmlDirectMapping);
}
在取消对entityType值的映射过程中,
取消映射RecordImpl.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
    }
....
}

不是一个安全的解决方案

我已经能够重现您看到的问题,但尚未找出原因。您可以使用以下错误跟踪此问题的进度:


在尝试了很多方法之后,我找到了解决这个问题的方法。我想在这里发布同样的内容,以便将来对其他人有所帮助。领导在大约5年前确认了这个问题,但似乎他们还没有解决,我也面临着类似的问题

基本上,我们可以使用
beforemashal
afterUnmarshal
方法来更改字段中的值

  • 您需要使用
    @xmlanyement(lax=true)
    以及
    映射创建一个字段
    列表
  • 删除
    @XmlPath(“.”)和
    XMLAdapter
  • @xmltransive
    标记字段
    Map
  • 现在,在
    beforemashall
    aftermarshall
    字段中,您可以交换数据。在
    beforemmarshal中的
    unmarshal
    过程中,
    所有未知字段值将出现在
    列表
    循环中,并将其添加到
    映射

    类似地,在
    封送处理期间
    ,您可以通过创建
    DOM
    元素将值
    映射
    移动到
    列表

    封送处理
    DOM元素
    存在时,所有值都被添加到
    根目录
    ,并且在
    解封期间
    首先读取已知值,然后由于
    @xmlanyement
    的原因,未知值存储在
    列表

    我使用
    Customer
    类创建了一个示例,您可以根据需要相应地修改它

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")
    @JsonInclude(Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    @XmlRootElement(name = "Customer")
    @XmlType(name = "Customer", propOrder = {"name", "age", "otherElements"})
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    @AllArgsConstructor
    @ToString
    @NoArgsConstructor
    public class Customer {
        @XmlTransient
        private String isA;
        private String name;
        private String age;
    
        @XmlAnyElement(lax = true)
        @JsonIgnore
        private List<Object> otherElements = new ArrayList<>();
    
    
        @JsonIgnore
        @XmlTransient
        private Map<String, Object> userExtensions = new HashMap<>();
    
        @JsonAnyGetter
        @JsonSerialize(using = CustomExtensionsSerializer.class)
        public Map<String, Object> getUserExtensions() {
            return userExtensions;
        }
    
        @JsonAnySetter
        public void setUserExtensions(String key, Object value) {
            userExtensions.put(key, value);
        }
    
        private void beforeMarshal(Marshaller m) throws ParserConfigurationException {
            System.out.println("Before Marshalling User Extension: " + userExtensions);
            ExtensionsModifier extensionsModifier = new ExtensionsModifier();
            otherElements = extensionsModifier.Marshalling(userExtensions);
            System.out.println("Before Marshalling Final Other Elements " + otherElements);
            userExtensions = new HashMap<>();
        }
    
        private void afterUnmarshal(Unmarshaller m, Object parent) throws ParserConfigurationException {
            System.out.println("After Unmarshalling : " + otherElements);
            ExtensionsModifier extensionsModifier = new ExtensionsModifier();
            userExtensions = extensionsModifier.Unmarshalling(otherElements);
            otherElements = new ArrayList();
        }
    }
    
    
    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,visible=true,PROPERTY=“isA”)
    @JsonInclude(Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown=true)
    @XmlRootElement(name=“客户”)
    @XmlType(name=“Customer”,proporter={“name”,“age”,“otherElements”})
    @XmlAccessorType(XmlAccessType.FIELD)
    @吸气剂
    @塞特
    @AllArgsConstructor
    @托斯特林
    @诺尔格构装师
    公共类客户{
    @XmlTransient
    私有字符串isA;
    私有字符串名称;
    私弦时代;
    @xmlanyement(lax=true)
    @杰索尼奥雷
    private List otherElements=new ArrayList();
    @杰索尼奥雷
    @XmlTransient
    私有映射userExtensions=newhashmap();
    @JsonAnyGetter
    @JsonSerialize(使用=CustomExtensionsSerializer.class)
    公共映射getUserExtensions(){
    返回用户扩展名;
    }
    @JSONANYSETER
    public void setUserExtensions(字符串键、对象值){
    userExtensions.put(键、值);
    }
    private void BeforeMarshall(Marshaller m)抛出ParserConfiguration异常{
    System.out.println(“在编组用户扩展之前:“+userExtensions”);
    ExtensionsModifier ExtensionsModifier=新的ExtensionsModifier();
    otherElements=extensionsModifier.Marshalling(userExtensions);
    System.out.println(“在编组最终其他元素之前”+其他元素);
    userExtensions=newhashmap();
    }
    私有void afterUnmarshal(解组器m,对象父对象)引发ParserConfiguration异常{
    System.out.println(“解组后:+其他元素”);
    ExtensionsModifier ExtensionsModifier=新的ExtensionsModifier();
    userExtensions=extensionsModifier.Unmarshalling(其他元素);
    otherElements=新的ArrayList();
    }
    }
    
    您可以在此处参考创建
    DOM元素


    您可以在这里参考我的完整答案:

    谢谢您的考虑,我添加了一个更好的测试用例,并在评论我当前的不安全工作解决方案您好,非常感谢您提出这个问题。事实上,就连我现在也被困在这个问题上很长时间了。经过大量的搜索和反复试验,我终于找到了这个问题。你找到解决这个问题的方法了吗?因为版本为
    3.0.0
    of
    Moxy
    的事件,我仍在查找问题。此外,错误通知单的
    状态仍然显示为
    NEW
    。我想知道发生了什么。我已经在这里发布了我的问题:嗨,我尝试了票子上提到的解决方案。但这对我还是不起作用。我已经在这里发布了我的问题,你能看一下并提供你的解决方案吗:你好,已经有一段时间了,但我确实记得我没有找到解决这个问题的完美方案。谢谢你的回答,伙计。是的,这是一个很长的时间,但如果可能的话,请你看看这个问题,看看你是否可以提供一些解决办法,你做了你的或一些建议?即使是一分钟的建议或解决方法都会对我有很大的帮助,因为我已经花了很多天的时间试图弄明白这一点:我试图调试
    EclipseLink Moxy
    代码,但它太庞大和复杂了。就我对Java的了解而言,很难找出哪里出了问题,因为那里发生了很多事情。
    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)
    
    org.eclipse.persistence.internal.oxm.XMLDirectMappingNodeValue
    
    public void endElement(XPathFragment xPathFragment, UnmarshalRecord unmarshalRecord) {
        ...
        line 205 unmarshalRecord.setAttributeValue(convertedValue, xmlDirectMapping);
    }
    
    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
        }
    ....
    }
    
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")
    @JsonInclude(Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    @XmlRootElement(name = "Customer")
    @XmlType(name = "Customer", propOrder = {"name", "age", "otherElements"})
    @XmlAccessorType(XmlAccessType.FIELD)
    @Getter
    @Setter
    @AllArgsConstructor
    @ToString
    @NoArgsConstructor
    public class Customer {
        @XmlTransient
        private String isA;
        private String name;
        private String age;
    
        @XmlAnyElement(lax = true)
        @JsonIgnore
        private List<Object> otherElements = new ArrayList<>();
    
    
        @JsonIgnore
        @XmlTransient
        private Map<String, Object> userExtensions = new HashMap<>();
    
        @JsonAnyGetter
        @JsonSerialize(using = CustomExtensionsSerializer.class)
        public Map<String, Object> getUserExtensions() {
            return userExtensions;
        }
    
        @JsonAnySetter
        public void setUserExtensions(String key, Object value) {
            userExtensions.put(key, value);
        }
    
        private void beforeMarshal(Marshaller m) throws ParserConfigurationException {
            System.out.println("Before Marshalling User Extension: " + userExtensions);
            ExtensionsModifier extensionsModifier = new ExtensionsModifier();
            otherElements = extensionsModifier.Marshalling(userExtensions);
            System.out.println("Before Marshalling Final Other Elements " + otherElements);
            userExtensions = new HashMap<>();
        }
    
        private void afterUnmarshal(Unmarshaller m, Object parent) throws ParserConfigurationException {
            System.out.println("After Unmarshalling : " + otherElements);
            ExtensionsModifier extensionsModifier = new ExtensionsModifier();
            userExtensions = extensionsModifier.Unmarshalling(otherElements);
            otherElements = new ArrayList();
        }
    }