Я бы рекомендовал использовать @XmlAccessType.FIELD
в соответствии с предложением Кевина в сочетании с XmlAdapter
, чтобы получить поведение, которое вы ищете:
Root
Чтобы этот пример работал с JAXB-RI, мне нужно создать поле типа Boolean
.Если вы используете EclipseLink JAXB (MOXy) , тогда вы можете сделать поле boolean
.
package forum7876493;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Root {
@XmlAttribute
@XmlJavaTypeAdapter(BooleanAdapter.class)
private Boolean a;
public boolean isA() {
return a;
}
public void setA(String s) {
this.a = "yes".equals(s) || "on".equals(s) || "in".equals(s);
}
}
BooleanAdapter
XmlAdapter
здесь вы можете добавить логику, которая есть в вашем методе setA(String)
.
package forum7876493;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<String, Boolean> {
@Override
public Boolean unmarshal(String s) throws Exception {
return "yes".equals(s) || "on".equals(s) || "in".equals(s);
}
@Override
public String marshal(Boolean b) throws Exception {
if(b) {
return "yes";
}
return "no";
}
}
Демо
package forum7876493;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Root root = (Root) unmarshaller.unmarshal(new File("src/forum7876493/input.xml"));
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
input.xml
<?xml version="1.0" encoding="UTF-8"?>
<root a="on"/>
Выход
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root a="yes"/>
ОБНОВЛЕНИЕ
В качестве альтернативы вы можете ввести String
геттер дляa
свойство.Вам нужно сделать метод isA()
как @XmlTransient
:
package forum7876493;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
@XmlRootElement
public class Root {
private boolean a;
@XmlTransient
public boolean isA() {
return a;
}
@XmlAttribute
public String getA() {
if(a) {
return "yes";
}
return "no";
}
public void setA(String s) {
this.a = "yes".equals(s) || "on".equals(s) || "in".equals(s);
}
}