JAXB.marshal実装を取り、jaxb.fragment = trueを追加してXMLプロローグを削除しました。このメソッドは、XmlRootElementアノテーションがなくてもオブジェクトを処理できます。これにより、チェックされていないDataBindingExceptionもスローされます。
public static String toXmlString(Object o) {
try {
Class<?> clazz = o.getClass();
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output
final QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
JAXBElement jaxbElement = new JAXBElement(name, clazz, o);
StringWriter sw = new StringWriter();
marshaller.marshal(jaxbElement, sw);
return sw.toString();
} catch (JAXBException e) {
throw new DataBindingException(e);
}
}
コンパイラの警告が気になる場合は、ここにテンプレート化された2つのパラメーターのバージョンがあります。
public static <T> String toXmlString(T o, Class<T> clazz) {
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); // remove xml prolog
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // formatted output
QName name = new QName(Introspector.decapitalize(clazz.getSimpleName()));
JAXBElement jaxbElement = new JAXBElement<>(name, clazz, o);
StringWriter sw = new StringWriter();
marshaller.marshal(jaxbElement, sw);
return sw.toString();
} catch (JAXBException e) {
throw new DataBindingException(e);
}
}
StringWriter
とても古いです。カバーの下ではStringBuffer
、はるかに高速なアプローチが使用されていたはずの場所が使用されますStringBuilder
が、StringWriterが最初に作成されたときは存在しませんでした。このため、へのすべての呼び出しはsw.toString()
同期を意味します。あなたがパフォーマンスを探しているなら悪い。