- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用 MOXy JAXB 来序列化类 A,它看起来像:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class A {
private Map<Foo, Bar> fooBar = new HashMap<Foo, Bar>();
private Set<Foo> foos = new HashSet<Foo>();
@XmlJavaTypeAdapter(FooBarMapAdapter.class)
public Map<Foo, Bar> getFooBar() {
return fooBar;
}
public void setFooBar(Map<Foo, Bar> fooBar) {
this.fooBar = fooBar;
}
@XmlElement
public Set<Foo> getFoos() {
return foos;
}
public void setFoos(Set<Foo> foos) {
this.foos = foos;
}
}
要点是“foos”字段中的 Foo 对象是 fooBar 映射中对象的超集。因此,我想将“fooBar”映射的关键元素“链接”到“foos”列表中的相应元素。我已经尝试使用 XmlID 和 XmlIDREF 注释:
@XmlAccessorType(XmlAccessType.NONE)
public class Foo {
private String xmlId;
@XmlID
@XmlAttribute
public String getXmlId() {
return xmlId;
}
public void setXmlId(String xmlId) {
this.xmlId = xmlId;
}
}
@XmlAccessorType(XmlAccessType.NONE)
public class Bar {
// Some code...
}
然后在我的 XmlAdapter 中,我尝试在改编后的 map 条目的 foo 对象上使用 XmlIDREF 注释:
public class FooBarMapAdapter extends
XmlAdapter<FooBarMapAdapter.FooBarMapType, Map<Foo, Bar>> {
public static class FooBarMapType {
public List<FooBarMapEntry> entries = new ArrayList<FooBarMapEntry>();
}
@XmlAccessorType(XmlAccessType.NONE)
public static class FooBarMapEntry {
private Foo foo;
private Bar bar;
@XmlIDREF
@XmlAttribute
public Foo getFoo() {
return foo;
}
public void setFoo(Foo foo) {
this.foo = foo;
}
@XmlElement
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
}
@Override
public FooBarMapType marshal(Map<Foo, Bar> map) throws Exception {
FooBarMapType fbmt = new FooBarMapType();
for (Map.Entry<Foo, Bar> e : map.entrySet()) {
FooBarMapEntry entry = new FooBarMapEntry();
entry.setFoo(e.getKey());
entry.setBar(e.getValue());
fbmt.entries.add(entry);
}
return fbmt;
}
@Override
public Map<Foo, Bar> unmarshal(FooBarMapType fbmt) throws Exception {
Map<Foo, Bar> map = new HashMap<Foo, Bar>();
for (FooBarMapEntry entry : fbmt.entries) {
map.put(entry.getFoo(), entry.getBar());
}
return map;
}
}
当编码上面的代码按预期工作并生成以下 XML 时:
<?xml version="1.0" encoding="UTF-8"?>
<a>
<fooBar>
<entries foo="nr1">
<bar/>
</entries>
</fooBar>
<foos xmlId="nr1"/>
</a>
为了测试解码,我使用了以下测试代码:
public class Test {
public static void main(String[] args) throws Exception {
A a = new A();
Map<Foo, Bar> map = new HashMap<Foo, Bar>();
Foo foo = new Foo();
foo.setXmlId("nr1");
Bar bar = new Bar();
map.put(foo, bar);
a.setFooBar(map);
a.setFoos(map.keySet());
final File file = new File("test.xml");
if (!file.exists())
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
JAXBContext jc = JAXBContext.newInstance(A.class);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(a, fos);
FileInputStream fis = new FileInputStream(file);
Unmarshaller um = jc.createUnmarshaller();
A newA = (A) um.unmarshal(fis);
System.out.println(newA.getFooBar());
}
}
这段代码产生了(对我来说)意想不到的结果:
{null=test.moxy.Bar@373c0b53}
即映射中用作key的Foo对象为null。如果我更改映射适配器并编码 Foo 对象两次,而不是使用 ID 引用,我不会得到这个空指针。
我已经能够使用 JAXB-RI 在 google 上找到一些关于此的帖子,其中可以按照 http://weblogs.java.net/blog/2005/08/15/pluggable-ididref-handling-jaxb-20 中所述编写 IDResolver 来解决问题。 .不幸的是,我无法在 MOXy JAXB JavaDoc 中找到有关此类的任何信息。
解决方法建议从 Blaise Doughan 的回答中,我意识到这是 JAXB 的 MOXy 实现中的一个错误。我已经能够为这个错误制定一个(丑陋的)解决方法。这个想法是,而不是使用 XMLAdapter map 在其定义类中“转换”。 A 类现在看起来像:
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class A {
private Map<Foo, Bar> fooBar = new HashMap<Foo, Bar>();
private Set<Foo> foos = new HashSet<Foo>();
// Due to a bug a XMLAdapter approch is not possible when using XmlIDREF.
// The map is mapped by the wrapper method getXmlableFooBarMap.
// @XmlJavaTypeAdapter(FooBarMapAdapter.class)
public Map<Foo, Bar> getFooBar() {
return fooBar;
}
public void setFooBar(Map<Foo, Bar> fooBar) {
this.fooBar = fooBar;
}
@XmlElement
public Set<Foo> getFoos() {
return foos;
}
public void setFoos(Set<Foo> foos) {
this.foos = foos;
}
// // WORKAROUND FOR JAXB BUG /////
private List<FooBarMapEntry> mapEntries;
@XmlElement(name = "entry")
public List<FooBarMapEntry> getXmlableFooBarMap() {
this.mapEntries = new LinkedList<FooBarMapEntry>();
if (getFooBar() == null)
return mapEntries;
for (Map.Entry<Foo, Bar> e : getFooBar().entrySet()) {
FooBarMapEntry entry = new FooBarMapEntry();
entry.setFoo(e.getKey());
entry.setBar(e.getValue());
mapEntries.add(entry);
}
return mapEntries;
}
public void setXmlableFooBarMap(List<FooBarMapEntry> entries) {
this.mapEntries = entries;
}
public void transferFromListToMap() {
fooBar = new HashMap<Foo, Bar>();
for (FooBarMapEntry entry : mapEntries) {
fooBar.put(entry.getFoo(), entry.getBar());
}
}
}
解码后,现在需要调用 transferFromListToMap 方法。因此,在获取对 newA 的引用后,应立即添加以下行:
newA.transferFromListToMap();
任何关于更好的解决方法/错误修复的建议将不胜感激:)。
最佳答案
注意:我是 EclipseLink JAXB (MOXy)铅。
我已经能够确认您遇到的问题:
为什么会出现这个问题
问题是由于 MOXy 在处理 @XmlIDREF
逻辑之前处理了 XmlAdapter
逻辑。 MOXy 对 XML 文档进行单次传递,并在最后处理 @XmlIDREF
关系以确保已构建所有引用对象(因为引用可能先于被引用对象,如这种情况)。
我将尝试发布此问题的解决方法,您可以使用上述错误跟踪我们在此问题上的进展。
关于java - moxy jaxb 中的 XmlAdapter 和 XmlIDREF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882337/
我有一个对象 (A),它具有另一个对象 (B) 的属性。当编码对象 A 时,我存储对对象 B 的引用。B 中的 ID 本身就是一个对象(Mongo ObjectId)。我已将 MongoId 对象包装
我有课 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "customerOrder", propOrder = { "demand
我有一个相当复杂的数据结构,我似乎无法正确解码。 @XmlRootElement class Tree { @XmlID private String id; @XmlJavaTypeAd
我对 XML 很陌生,我遇到了一个无法解决的问题,在环顾了几个小时后,我决定发布我的问题。 我使用 @XmlIDREF 来获取 XML 文档中某些 Java 类的 XmlID。一切工作正常,但是当 J
我已经研究这个问题好几个小时了,可能很简单,但我不再明白了: 我有一个通过 jax-rs 呈现为 json 的实体 (Param)。该实体引用另一个实体(步骤)。在编写/读取 json 时,我不想看到
好的。我是 JAXB 新手,在 XmlID 和 XmlIDREF 方面遇到一些麻烦,其中 ID 位于抽象类中。 这是我的问题: 抽象类 @XmlAccessorType(XmlAccessType.F
jaxb @XmlIDREF @XmlID 工作惊人 我的 xml 输入是 1
本文整理了Java中org.apache.xmlbeans.XmlIDREF.set()方法的一些代码示例,展示了XmlIDREF.set()的具体用法。这些代码示例主要来源于Github/Stack
我有以下类(class): @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Employee {
我正在尝试使用 JAXB 整理一些数据。我的问题如下:我有一个类 Frame,其中包含信号图。 @XmlRootElement(name = "frame") @XmlAccessorType(Xml
我已经为我遇到的问题设置了一个最小的工作示例。这些是 JAXB 类。 moxytest/A.java package moxytest; @XmlRootElement public class A
我想知道是否可以注释我的类,以便编码器第一次遇到一个对象时,它会生成一个适当类型的 XML 元素,但是任何其他任何对该对象的后续引用都将具有一个 XML IDREF条目已创建? 最佳答案 您可以利用
我正在使用 jax-ws 编写 Web 服务。 Web 服务的方法之一返回 bean,其中包含对其父级的引用。为了防止循环引用,我在我的 bean 中使用了 JAXB @XMLID 和 @XMLIDR
我有以下 XML: RIGHT1 RIGHT_NOT_EXISTING 这里是映射: @XmlAccessorType(XmlAccessType.FIELD) publ
我正在尝试使用 MOXy JAXB 来序列化类 A,它看起来像: @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement public class A
我正在使用 CXF 公开 Web 服务。我使用 @XmlID 和 @XmlIDREF JAXB 注释来在编码/解码期间维护对象图的引用完整性。 WSDL 正确地包含具有 xs:id 和 xs:idre
您好,我在使用网络服务时遇到问题我有一个包含许多角色的用户对象。 当我从包含一个角色的网络服务中获取一个用户(Id:3)时,该角色包含许多用户(id:3和id 2)。我收到一个错误 由以下原因引起:j
更新 - 查看底部的编辑 IDRefs/keyrefs 似乎在 JAXB 注释中是可能的,但 ref 最终成为元素文本。 我希望 ref 是元素的属性。 例如,给定这个对象模型: @XmlType p
我想知道是否可以对我的类进行注释,以便编码器第一次遇到对象时,它会生成适当类型的 XML 元素,但任何其他对该对象的后续引用都将具有 XML IDREF条目已创建? 最佳答案 您可以利用 JAXB 的
我有这样两个实体: @XmlRootElement(name = "provider") @XmlAccessorType(XmlAccessType.PROPERTY) @Entity pub
我是一名优秀的程序员,十分优秀!