如何在使用Javax@XmlElement读取属性时预处理xml字段



我在Spring引导项目中有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输入是否正确,或者我想大写"Name",然后将它们设置为对象字段。我该怎么做?

是的,将@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
}
. . .
}

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

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

最新更新