@XmlAccessorType+@XmlElement完美解决Java类到XML映射问题

2023-12-21 17:59:29

前言:

最近项目在做静态代码扫描的时候,出现Java类中成员变量命名的问题,开头字母必须小写,但是这个类成员是对接其他公司的字段,对方提供的请求格式是XML,必须将Java类转化为XML的格式,而且这个类成员变量开头还必须大写,网上查阅了大量资料,总结出了使用这个三个变量可以完美解决问题。

这里笔者就不使用@Data注解了,方便食用!!!

目的:

1 将Java类成功映射成XML

2 类中某个成员变量开头大写

准备:

@XmlAccessorType 和 @XmlElement 是 Java Architecture for XML Binding (JAXB) 规范中的注解,用于控制 Java 对象与 XML 表示之间的映射关系。

@XmlAccessorType(XmlAccessType.FIELD):

工作原理: 该注解用于指定 JAXB 在映射 Java 类与 XML 之间的时候,应该访问哪一种属性。XmlAccessType.FIELD 表示 JAXB 应该直接访问类的字段(fields),而不是通过 getter 和 setter 方法。
作用: 控制 JAXB 如何访问类的属性。

@XmlElement:

工作原理: 该注解用于映射 Java 类的字段或属性到 XML 元素。它可以用在字段或 getter 方法上。
作用: 定义 Java 对象如何转换为 XML 元素以及反向转换。

三种不同场景示例:

场景一:仅使用 @XmlElement 注解,这里注意一般是写在get方法上面

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

@XmlRootElement
public class Person {
    
    private String name;
    private int age;

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

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

    @XmlElement
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

结果:

<person>
    <name>John Doe</name>
    <age>30</age>
</person>

场景二:仅使用 @XmlAccessorType(XmlAccessType.FIELD) 注解

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    
    private String name;
    private int age;

    // No need for @XmlElement here
    public String getName() {
        return name;
    }

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

    // No need for @XmlElement here
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

结果:

<person>
    <name>John Doe</name>
    <age>30</age>
</person>

场景三:共同使用 @XmlAccessorType(XmlAccessType.FIELD) 和 @XmlElement 注解

这里已经很明显了,在使用@XmlAccessorType(XmlAccessType.FIELD)基础上,可以修改成员变量映射XML后的名称

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
    
    // No need for @XmlElement here
    private String name;

    // No need for @XmlElement here
    private int age;

    // @XmlElement is required here
    @XmlElement(name = "Acity")
    private String address;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

结果:

<person>
    <name>John Doe</name>
    <age>30</age>
    <Acity>New York</Acity>
</person>

总结:

第三种场景就可以满足本次需求!!!

在上述示例中,第一个场景使用了 @XmlElement 注解,第二个场景使用了 @XmlAccessorType(XmlAccessType.FIELD) 注解,而第三个场景同时使用了两者。在场景三中,对于 address 字段,使用了 @XmlElement(name = "Acity") 来指定 XML 元素的名称。这些注解的组合方式可以根据需求来灵活使用,以达到对 XML 与 Java 对象的映射要求。

文章来源:https://blog.csdn.net/maple05/article/details/135133292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。