Jaxb @XmlPath(";)与@XmlAdapter冲突
有了这个JAXBXML定义,我尝试通过添加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
@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
}
....
}
不是一个安全的解决方案我已经能够重现您看到的问题,但尚未找出原因。您可以使用以下错误跟踪此问题的进度:
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
ofMoxy
的事件,我仍在查找问题。此外,错误通知单的状态仍然显示为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();
}
}