2011-12-19 5 views
1

Мне нужно маршалить объект JAXB в строку формата XML. Я использую SLSB и подключаю код для создания Marshaller и других вещей в методе комментариев @PostConstruct. Так что каждый раз мне не нужно загружать схему и создавать Маршаллер.Инициализация Marshaller JAXB

Код в @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, самый быстрый подход вернуть то же самое?).

Благодаря

ответ

3

Я не знаю никакого другого пути сортировочных/демаршаллизации с JAXB. Когда у меня была такая же проблема, я проверил код CXF, и это было то же самое.

См JAXB Performance and Thread safety

+0

Приобретение инициализирующего кода для @PostConstruct не вызовет никаких проблем правильно? Я имею в виду, что сеансы смешиваются во время последовательных вызовов, если объект, подлежащий сортировке, передается как параметр? – nobody

+0

Проверьте предоставленную ссылку. Я думаю, что это, вероятно, дает лучший ответ на ваш вопрос. – AValchev

1

не имеет прямое отношение к вашему вопросу, но ByteArrayOutputStream # ToString() будет использовать кодировку по умолчанию платформы, а не кодирование используется JAXB при создании документа XML. В зависимости от ваших дальнейших планов с XML-документом может быть лучше сохранить его как байтовый массив, а не пытаться сделать из него потенциально неправильную строку.