Jaxb EclipseLink MOXy不编组用@XMLAttribute注释的子图字段

Jaxb EclipseLink MOXy不编组用@XMLAttribute注释的子图字段,jaxb,eclipselink,moxy,Jaxb,Eclipselink,Moxy,问题的标题是不言自明的。我可以在这里的示例中复制这个问题: 如果你改变 @XmlNamedObjectGraph( name=“simple”, 属性节点={ @XmlNamedAttributeNode(“值”), } ) 到 @XmlNamedObjectGraph( name=“simple”, 属性节点={ @XmlNamedAttributeNode(“类型”), } ) 然后在marsahalled输出中,元素为空且没有属性 我希望看到type作为元素的属性 我使用的是Ecli

问题的标题是不言自明的。我可以在这里的示例中复制这个问题:

如果你改变

@XmlNamedObjectGraph(
name=“simple”,
属性节点={
@XmlNamedAttributeNode(“值”),
}
)

@XmlNamedObjectGraph(
name=“simple”,
属性节点={
@XmlNamedAttributeNode(“类型”),
}
)
然后在marsahalled输出中,
元素为空且没有属性

我希望看到
type
作为
元素的属性

我使用的是EclipseLink MOXy版本2.5.0

输入:


无名氏
一条街
任何城镇
安大略
A1B 2C3
B路2号
另一个地方
魁北克省
X7Y 8Z9
555-1111
555-2222
输出:


无名氏
任何城镇
安大略
预期输出:


无名氏
任何城镇
安大略
类的代码(从上面的链接复制粘贴):

客户:

package blog.objectgraphs.metadata;
导入java.util.List;
导入javax.xml.bind.annotation.*;
导入org.eclipse.persistence.oxm.annotations.*;
@XmlNamedObjectGraph(
name=“联系人信息”,
属性节点={
@XmlNamedAttributeNode(“名称”),
@XmlNamedAttributeNode(value=“billingAddress”,subgraph=“location”),
@XmlNamedAttributeNode(value=“phoneNumbers”,subgraph=“simple”)
},
子图={
@XmlNamedSubgraph(
name=“location”,
属性节点={
@XmlNamedAttributeNode(“城市”),
@XmlNamedAttributeNode(“省”)
}
)
}
)
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类客户{
@XmlAttribute
私有int-id;
私有字符串名称;
私人地址计费地址;
私人地址;
@XmlElementWrapper
@xmlement(name=“phoneNumber”)
私人电话号码列表;
}
地址:

package blog.objectgraphs.metadata;
导入javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
公共课堂演讲{
私家弦街;;
私人城市;
私人弦省;
专用字符串后代码;
}
电话号码:

package blog.objectgraphs.metadata;
导入javax.xml.bind.annotation.*;
导入org.eclipse.persistence.oxm.annotations.*;
@XmlNamedObjectGraph(
name=“simple”,
属性节点={
@XmlNamedAttributeNode(“值”),
}
)
@XmlAccessorType(XmlAccessType.FIELD)
公共类电话号码{
@XmlAttribute
私有字符串类型;
@XmlValue
私有字符串值;
}
演示:

package blog.objectgraphs.metadata;
导入java.io.File;
导入javax.xml.bind.*;
导入org.eclipse.persistence.jaxb.MarshallerProperties;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Customer.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
File xml=新文件(“src/blog/objectgraphs/metadata/input.xml”);
Customer=(Customer)unmarshaller.unmarshal(xml);
//输出XML
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(客户、系统、输出);
//基于对象图的输出XML
setProperty(MarshallerProperties.OBJECT_图,“联系人信息”);
marshaller.marshall(客户、系统、输出);
//基于对象图的输出JSON
setProperty(MarshallerProperties.MEDIA_类型,“application/json”);
setProperty(MarshallerProperties.JSON_INCLUDE_ROOT,false);
setProperty(MarshallerProperties.JSON_包装器_作为_数组_名称,true);
marshaller.marshall(客户、系统、输出);
}
}

您看到的问题是由于EclipseLink 2.5.0版本中的以下错误造成的:

该问题已在EclipseLink 2.5.1版本中修复,该版本可从以下链接获得:

使用EclipseLink 2.5.1,您可以获得以下输出:


无名氏
任何城镇
安大略

更新
只有一个区别,早些时候它用来整理电话号码列表 JSON作为“电话号码”:[“555-1111”,“555-2222”]但现在它 编组为“电话号码”:[{“值”:“555-1111”},{“值”: "555-2222" } ]. 新的一个在逻辑上更加一致,因为它 表示对象图的真实性质,但是我可以想到 旧格式可能更有用的情况。例如,如果你 要发送ID列表(XMLIDRefs),然后将其作为JSON发送吗 整数数组看起来比发送JSON对象数组更好 依次包含一个整数

这是我们有目的的改变。大多数用户倾向于行为一致。现在,无论是否应用过滤器,您都可以使用相同的机制来获取值


如果POJO中唯一映射的属性具有
@XmlValue
,则不会使用
键。

按预期工作。谢谢。只是有一点不同,之前它用JSON将电话号码列表封送为“电话号码”:[“555-1111”,“555-2222”],但现在它封送为“电话号码”:[{“值”:“555-1111”},{“值”:“555-2222”}]。新的格式在逻辑上更加一致,因为它代表了对象图的真实性质,但是我可以想到旧格式可能更有用的情况。例如,如果要发送ID列表(XMLIDRefs),则将其作为JSON数组发送