JAXB "有两个名为 "**" 的属性,类的两个属性具有相同名称 "**""解决方案

   用eclipse写JAXB时,发现总是报这样的错。

   

这是为什么呢?

在网上搜索到的jaxb2的中文教程很少,而且内容太过简单,查阅了一些英文的资料,发现问题是“名称的冲突”。
这里说的名称冲突指的是: JavaBean 属性名称与字段名称之间的名称冲突。
在pojo类中的setter和getter方法会导致运行报错:
Exception in thread “main” com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:
2 counts of IllegalAnnotationExceptions
这时我们就要用到另一个注释:@XmlTransient,用来防止映射使用@XmlTransient注释的字段或者javabean的属性,从而解决名称冲突。
具体的用法是将@XmlElement和@XmlTransient分别加到javabean属性前和对应的getter方法前:

  1. package entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.xml.bind.annotation.XmlElement;  
  6. import javax.xml.bind.annotation.XmlRootElement;  
  7. import javax.xml.bind.annotation.XmlTransient;  
  8.   
  9. @XmlRootElement //表示student是一个跟元素  
  10. public class Student implements Serializable {  
  11.     @XmlElement //name作为student的一个子元素  
  12.     private String name;  
  13.     @XmlElement //gender作为student的一个子元素  
  14.     private String gender;  
  15.   
  16.     public Student() {  
  17.   
  18.     }  
  19.   
  20.     public Student(String name, String gender) {  
  21.         this.name = name;  
  22.         this.gender = gender;  
  23.     }  
  24.   
  25.     @XmlTransient  
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.   
  30.     @XmlTransient  
  31.     public String getGender() {  
  32.         return gender;  
  33.     }  
  34.   
  35.     public void setName(String name) {  
  36.         this.name = name;  
  37.     }  
  38.   
  39.     public void setGender(String gender) {  
  40.         this.gender = gender;  
  41.     }  
  42.   
  43. }  
package entity;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement //表示student是一个跟元素
public class Student implements Serializable {
    @XmlElement //name作为student的一个子元素
    private String name;
    @XmlElement //gender作为student的一个子元素
    private String gender;

    public Student() {

    }

    public Student(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }

    @XmlTransient
    public String getName() {
        return name;
    }

    @XmlTransient
    public String getGender() {
        return gender;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}
可参考  The Great JAXB API Blunder  和  Should JAXB Word With Fields or Properties?  英文不好,此处不作翻译

抱歉,我是一名AI语言模型,无法编写具体的代码。不过我可以提供一份通用的jaxb工具模板,供您参考: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.Marshaller; import java.io.File; public class JAXBUtils { /** * xml转JavaBean对象 * @param <T> 对象型 * @param xmlFile xml文件 * @param tClazz 对象class型 * @return 对象 * @throws JAXBException JAXB异常 */ public static <T> T xml2Bean(File xmlFile, Class<T> tClazz) throws JAXBException { T t = null; JAXBContext jaxbContext = JAXBContext.newInstance(tClazz); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); t = (T) jaxbUnmarshaller.unmarshal(xmlFile); return t; } /** * JavaBean对象转xml * @param obj 对象 * @param xmlFile xml文件 * @throws JAXBException JAXB异常 */ public static void bean2Xml(Object obj, File xmlFile) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(obj, xmlFile); } } ``` 使用示例: ```java public static void main(String[] args) { try { // xml文件转JavaBean对象 File xmlFile = new File("test.xml"); User user = JAXBUtils.xml2Bean(xmlFile, User.class); System.out.println(user.toString()); // JavaBean对象转xml文件 File newXmlFile = new File("newtest.xml"); JAXBUtils.bean2Xml(user, newXmlFile); } catch (JAXBException e) { e.printStackTrace(); } } ``` 其中,User为自定义的JavaBean对象,test.xml为xml文件,newtest.xml为输出的xml文件。具体实现时,需要根据自己的需求修改部分实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值