0
私はJAXBで生成されたクラスを持っています。ルートタグクラスは以下に示すFooです。Javaから@XmlRootタグを動的に追加するにはどうすればよいですか?
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"input"
})
@XmlRootElement(name = "Foo")
public class Foo {
@XmlElement(name = "Input", required = true)
protected Too input;
public Too getInput() {
return input;
}
public void setInput(Too value) {
this.input = value;
}
}
以下のようなサブタグクラスがあります。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bar", propOrder = {
"request"
})
public class Bar {
@XmlElement(name = "Request", required = true)
protected List<RequestType> request;
public List<RequestType> getRequest() {
if (request == null) {
request = new ArrayList<RequestType>();
}
return this.request;
}
}
バーをルートクラスとして使用してxmlを構築する必要がある場合があります。私はオブジェクトから文字列に変換するためにJaxb Marshallarを使用します。
public static String jaxbObjectToXMLString(Object obj) {
try {
final Marshaller m = JAXBContext.newInstance(obj.getClass()).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
final StringWriter w = new StringWriter();
m.marshal(obj, w);
return w.toString();
} catch (JAXBException e) {
logger.error("Returning empty xml string", e);
return EMPTY_STR;
}
}
@ XmlRootElement(name = "Bar")と記述すると、マーシャルできます。私はバーを私のルートタグにしたくないので、クラスにこれを追加したくない。私が渡しているオブジェクトに基づいてjaxbObjectToXMLString(Object obj)の内部でこれを行う方法がありますか?
if(obj instanceof Bar) { dynamically make bar as XmlRoot and generate xml}
else if(obj instanceof Foo){ marshall as it is}