Я хочу демаршалировать xml содержимое следующим образом:
JAXBContext context = JAXBContext.newInstance(Node.class);
String input = "<item><d>foo</d></item>";
StreamSource istream = new StreamSource(new StringReader(input));
JAXBElement<Node> node = context.createUnmarshaller().unmarshal(istream, Node.class);
System.out.println(node.getValue().toString());
Элемент d
нельзя тривиально преобразовать в желаемый объект, здесь логическое , поэтому я использую метод установки для этого.
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "item")
public class Node {
@XmlElement(name = "d")
private Boolean value;
public void setValue(String d) {
this.value = d.equals("") ? Boolean.TRUE : Boolean.FALSE;
}
@Override
public String toString() {
return value.toString();
}
}
XmlAnnotaion
также может быть setValue
, однако, когда я добавляю метод получения, он должен быть в поле (в противном случае нет синтаксического анализа и value
остается null
).
public Boolean getValue() {return value;}
Но если вместо foo
значение начинается с di git или специального символа, скажем ?
, синтаксический анализ снова отсутствует.
Сводка эффектов:
аннотация в поле + без геттера -> анализирует foo
аннотация в сеттере + без геттера -> анализирует foo
и 0foo
аннотация в поле + геттер -> анализирует foo
аннотация в сеттере + получателе -> не анализирует ни
Как мне нужно установить аннотации, чтобы я мог анализировать произвольные значения в d
, и почему это работает здесь для строк, начинающихся с буквы?