首页 > 解决方案 > 使用 Javax @XmlElement 读取属性时如何预处理 xml 字段

问题描述

我在 Spring Boot 项目中有 properties.xml,如下所示:

...
<RestConnect>
    <Name>OpenBanking</Name>
    <RestEnable>true</RestEnable>
    <IP>192.168.11.11</IP>
    <Port>3311</Port>
</RestConnect>
...

对应的java文件是:

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 RestConnectProperties {

    @XmlElement(name = "Name")
    private String name = "Unknown";

    @XmlElement(name = "RestEnable")
    private boolean restEnable = true;

    @XmlElement(name = "IP")
    private String ip = "";

    @XmlElement(name = "Port")
    private String port = "";


    public RestConnectProperties() {
    }

    public String getName() {
        return name;
    }

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

    public boolean isRestEnable() {
        return restEnable;
    }

    public void setRestEnable(boolean restEnable) {
        this.restEnable = restEnable;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

}

它将值正确设置到相关字段中。

我想对字段进行预处理。例如,我想检查 IP 是否输入正确,或者我想将“名称”大写,然后将它们设置为对象字段。我该怎么做?

标签: javaxmlspring-bootxml-parsing

解决方案


是的,将@XmlElement/@XmlAttribute注释移动到 getter 方法。

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE) // ONLY PROCESS ANNOTATED FIELDS/PROPERTIES
public class RestConnectProperties {
    . . .

    // REMOVE THIS: @XmlElement(name = "Name")
    private String name = "Unknown";

    . . .

    @XmlElement(name = "Name") // ADD HERE
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name.toUpperCase(); // PROCESS HERE
    }

    . . .
}

我更喜欢更改@XmlAccessorTypeXmlAccessType.NONE,因此 JAXB 仅使用显式注释的字段和/或属性 getter/setter 方法。

您当然可以继续使用XmlAccessType.FIELD,但是您必须添加@XmlTransient到字段中,因此您可以通过 JAXB 从基于字段的处理切换到基于属性的处理。


推荐阅读