Мне нужно маршалировать объект JAXB в строку формата xml. Я использую SLSB и подключаю код для создания Marshaller
и других вещей в аннотированном методе @PostConstruct
. Так что каждый раз мне не нужно загружать схему и создавать маршаллера.
Код в @PostConstruct
аннотированном методе, как показано ниже.
JAXBContext jaxbContext = JAXBContext.newInstance(jaxbPackageName);
SchemaFactory factory = SchemaFactory
.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaUrl = Thread.currentThread().getContextClassLoader()
.getResource(resourcePath);
schema = factory.newSchema(schemaUrl);
setMarshaller(jaxbContext.createMarshaller());
getMarshaller().setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.FALSE);
getMarshaller().setSchema(schema);
getMarshaller().setEventHandler(new DefaultValidationEventHandler());
setUnmarshaller(jaxbContext.createUnmarshaller());
getUnmarshaller().setSchema(schema);
getUnmarshaller().setEventHandler(new DefaultValidationEventHandler());
И когда клиентскому коду требуется формат объекта в формате xml, следующий метод возвращает то же самое.
OutputStream outputStream = new ByteArrayOutputStream();
getMarshaller().setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
schemaLocation);
getMarshaller().marshal(document, outputStream);
xmlString = outputStream.toString();
Меня беспокоит, есть ли лучший способ сделать то же самое (когда клиентский код хочет получить XML-формат объекта JAXB, самый быстрый способ вернуть то же самое?).
Спасибо