我正在尝试将xml解析为java对象,我已阅读并实现了以下教程:
http://www.vogella.com/articles/JAXB/article.html (works perfectly)
但是当我创建自己的clases时(类似于教程中的那些)
我得到:线程中的异常"main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:IllegalAnnotationExceptions的1个计数 Class has two properties of the same name "clienteList"
除非我在类Clientes上使用@XmlAccessorType(XmlAccessType.FIELD),但在教程中没有使用 .
有任何想法吗 ?
(它与@XmlAccessorType(XmlAccessType.FIELD)注释一起工作正常,但我想知道为什么我的类需要它而不是教程中的类)
提前感谢您提供任何信息 .
class 客户
package mx.com.findep.crediseguros.dto.servicios.finsol;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "cliente")
public class Cliente {
private String numeroPersona;
@XmlElement(name = "numeroPersona")
public String getNumeroPersona() {
return numeroPersona;
}
public void setNumeroPersona(String numeroPersona) {
this.numeroPersona = numeroPersona;
}
}
class 客户
package mx.com.findep.crediseguros.dto.servicios.finsol;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "clientes")
//@XmlAccessorType(XmlAccessType.FIELD) //without this line it fails
public class Clientes {
// XmLElementWrapper generates a wrapper element around XML representation
@XmlElementWrapper(name = "clienteList")
// XmlElement sets the name of the entities
@XmlElement(name = "cliente")
private ArrayList<Cliente> clienteList;
public void setClienteList(ArrayList<Cliente> clienteList) {
this.clienteList = clienteList;
}
public ArrayList<Cliente> getClienteList() {
return clienteList;
}
}
测试我的编组
package mx.com.findep.crediseguros.dto.servicios.finsol;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class TestClientesXml {
private static final String SOME_XML = "C:/bea/user_projects/domains/DominioDesarrollo/esquemas/calculoCostoSeguroPeticion.xml";
public static void main(String[] args) throws JAXBException, IOException {
ArrayList<Cliente> clienteList = new ArrayList<Cliente>();
Cliente cliente1 = new Cliente();
cliente1.setNumeroPersona("1");
clienteList.add(cliente1);
Cliente cliente2 = new Cliente();
cliente2.setNumeroPersona("2");
clienteList.add(cliente2);
Clientes clientes = new Clientes();
clientes.setClienteList(clienteList);
JAXBContext context = JAXBContext.newInstance(Clientes.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(clientes, System.out);
m.marshal(clientes, new File(SOME_XML));
System.out.println();
System.out.println("Output from our XML File: ");
Unmarshaller um = context.createUnmarshaller();
Clientes clientes2 = (Clientes) um.unmarshal(new FileReader(SOME_XML));
ArrayList<Cliente> list = clientes2.getClienteList();
for (Cliente cliente : list) {
System.out.println("Cliente: " + cliente.getNumeroPersona());
}
}
}
2 回答
默认情况下,JAXB将公共字段和属性视为映射 . 如果您注释一个字段,那么它会将字段和属性视为映射导致冲突 . 如果没有
@XmlAccessorType(XmlAccessType.FIELD)
,您应该注释get或set方法 .For More Information
所以我们说:
如果我们运行代码,我们将在线程“main”中有Exception
但是如果我们添加注释: XmlAccessorType
错误将消失 .
当有一个想要编组并且有10个字段的类时,我更喜欢只注释字段,而不是一次设置setter然后是getter . 因此,请使用@XmlAccessorType并仅注释字段 .