- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果有一些带有相同值的@XmlID 注释属性,即使它们属于不同类型,JAXB 也无法成功解码对象,但是编码很好。
这是一个错误吗?
否则,如何支持该功能?
代码:
package xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
public class MultiID {
static public class LongXmlAdapter extends XmlAdapter<String, Long> {
@Override
public Long unmarshal(String s) {
return Long.parseLong(s);
}
@Override
public String marshal(Long number) {
if (number == null) return "";
return number.toString();
}
}
static public class Element {
private Long id;
@XmlID
@XmlAttribute(required=true)
@XmlJavaTypeAdapter(LongXmlAdapter.class)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
static public class Component {
private Long id;
@XmlID
@XmlAttribute(required=true)
@XmlJavaTypeAdapter(LongXmlAdapter.class)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
private Element elem;
@XmlIDREF
@XmlAttribute(required=true)
public Element getElem() {
return elem;
}
public void setElem(Element e) {
this.elem = e;
}
}
@XmlRootElement
static public class Container {
private List<Element> elemLst = new ArrayList<Element>();
private List<Component> lst = new ArrayList<Component>();
@XmlElementWrapper(name="elemList")
@XmlElement(name="elem")
public List<Element> getElemLst() {
return (elemLst != null)?elemLst:(elemLst = new ArrayList<Element>());
}
public void setElemLst(List<Element> elemLst) {
this.elemLst = elemLst;
}
@XmlElementWrapper(name="componentList")
@XmlElement(name="component")
public List<Component> getLst() {
return (lst != null)?lst:(lst = new ArrayList<Component>());
}
public void setLst(List<Component> lst) {
this.lst = lst;
}
}
static public class XmlSerialization {
public static Object read(String filepath, Class... classesToBeBound) throws FileNotFoundException {
Object entity = null;
try {
File file = new File(filepath);
if(!file.exists()) throw new FileNotFoundException(filepath);
JAXBContext context = JAXBContext.newInstance(classesToBeBound);
Unmarshaller um = context.createUnmarshaller();
entity = um.unmarshal(file);
} catch (JAXBException ex) {
Logger.getLogger(XmlSerialization.class.getName()).log(Level.SEVERE, null, ex);
}
return entity;
}
public static void write(String filePath, Object entity, Class... classesToBeBound) {
File file = new File(filePath);
try {
JAXBContext context = JAXBContext.newInstance(classesToBeBound);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(entity, file);
} catch (JAXBException ex) {
Logger.getLogger(XmlSerialization.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public Container createContainer() {
Container container = new Container();
for(long i = 1 ; i < 5; ++i) {
Element elem = new Element();
elem.setId(i);
container.getElemLst().add(elem);
Component comp = new Component();
comp.setId(i);
comp.setElem(elem);
container.getLst().add(comp);
}
return container;
}
public void write(String filePath, Container container) {
XmlSerialization.write(filePath, container, Container.class, Component.class, Element.class);
}
public Container read(String filePath) {
Container container = null;
try {
container = (Container)XmlSerialization.read(filePath, Container.class, Component.class, Element.class);
} catch (FileNotFoundException ex) {
Logger.getLogger(MultiID.class.getName()).log(Level.SEVERE, null, ex);
}
return container;
}
public static void main(String[] args) {
MultiID test = new MultiID();
String filePath = "c:\\tmp.xml";
Container c1 = test.createContainer();
test.write(filePath, c1);
Container c2 = test.read(filePath);
filePath = "c:\\tmp2.xml";
test.write(filePath, c2);
}
}
输出:
[tmp.xml]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container>
<elemList>
<elem id="1"/>
<elem id="2"/>
<elem id="3"/>
<elem id="4"/>
</elemList>
<componentList>
<component id="1" elem="1"/>
<component id="2" elem="2"/>
<component id="3" elem="3"/>
<component id="4" elem="4"/>
</componentList>
</container>
[tmp2.xml]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container>
<elemList>
<elem id="1"/>
<elem id="2"/>
<elem id="3"/>
<elem id="4"/>
</elemList>
<componentList>
<component id="1"/>
<component id="2"/>
<component id="3"/>
<component id="4"/>
</componentList>
</container>
tmp2.xml 中的每个“组件”都没有元素引用。那就是问题所在。例如,如果我们从 100 开始更改组件 ID,它将按预期工作。
如何解决这个问题?非常感谢。
最佳答案
您的输出是由于 JAXB (JSR-222) 的实现中存在错误所致你正在使用。使用 JDK 1.7.0 for the Mac 和 EclipseLink JAXB (MOXy) 中包含的 JAXB impl 运行示例代码我得到了 tmp2.xml 的预期结果。
tmp2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container>
<elemList>
<elem id="1"/>
<elem id="2"/>
<elem id="3"/>
<elem id="4"/>
</elemList>
<componentList>
<component elem="1" id="1"/>
<component elem="2" id="2"/>
<component elem="3" id="3"/>
<component elem="4" id="4"/>
</componentList>
</container>
关于java - 如何在 JAXB 中处理多个@XmlID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651521/
我不太明白 @XmlIDREF 和 @XmlID 如何协同工作。通过使用 XmlIDREF,我只创建对实际元素的引用。但是 XmlID 的用例是什么。 我想创建对 Publication 类的引用。使
我有以下层次结构: public class Small { private String xmlId; @XmlID @XmlAttribute public Str
如果有一些带有相同值的@XmlID 注释属性,即使它们属于不同类型,JAXB 也无法成功解码对象,但是编码很好。 这是一个错误吗? 否则,如何支持该功能? 代码: package xml; impor
好的。我是 JAXB 新手,在 XmlID 和 XmlIDREF 方面遇到一些麻烦,其中 ID 位于抽象类中。 这是我的问题: 抽象类 @XmlAccessorType(XmlAccessType.F
jaxb @XmlIDREF @XmlID 工作惊人 我的 xml 输入是 1
我有以下类(class): @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Employee {
我正在使用 Hibernate 和 RESTeasy,我尽量避免与这些实体形成循环,因为我在 Artiste 和 Oeuvre 实体之间存在 OneToMany (ManyToOne) 双向关系: O
我有两个类,如下所示,带有 JAXB 注释。我查过有关应对周期的信息,但我仍然不明白。在示例中,@XmlID 和@XmlIDREF 在这两个类中如何相互协作?为什么两个类中都有@XmlDREF?有人可
我正在尝试将两个不同的 XML 文件编码/取消编码到 POJOS。第一个 XML 文件如下所示: --Network.xml--
根据 https://gist.github.com/VineetReynolds/5108580 ,JAXB 规范要求用 @XmlID 注释的元素是 String。 MOXy 在 2.5.x 版
我正在尝试将两个不同的 XML 文件编码/取消编码到 POJOS。第一个 XML 文件如下所示: --Network.xml--
我正在使用 CXF 公开 Web 服务。我使用 @XmlID 和 @XmlIDREF JAXB 注释来在编码/解码期间维护对象图的引用完整性。 WSDL 正确地包含具有 xs:id 和 xs:idre
您好,我在使用网络服务时遇到问题我有一个包含许多角色的用户对象。 当我从包含一个角色的网络服务中获取一个用户(Id:3)时,该角色包含许多用户(id:3和id 2)。我收到一个错误 由以下原因引起:j
我已经实现了一个基于 JPA 和 JAXB 的 REST API。 我有一个大致像这样的类(非常简化): @Entity @XmlRootElement ... public class Thing
我有这样两个实体: @XmlRootElement(name = "provider") @XmlAccessorType(XmlAccessType.PROPERTY) @Entity pub
我正在使用@XmlID 和@XmlIDREF 标记从一个对象引用另一个对象。即使使用继承类,它在 Java 6 中也能正常工作。我创建的示例代码如下所示。基类使用的标签: @XmlRootElemen
我是一名优秀的程序员,十分优秀!