2010-03-17 3 views
4

У меня есть класс, назовем его Пользователь аннотируется @XmlRootElement, с некоторыми свойствами (имя, фамилия и т. Д.).jaxb entity print out as xml

Я использую этот класс для операций REST, как application/xml.

Клиент будет POST User class, поэтому я хочу сохранить значения в журнале.

Есть ли способ в jaxb распечатать этот объект как xml?

Например:

log.info("Customers sent: "+user.whichMethod()); 

должен производить этот вывод:

 
Customer sent: 
<user> <name>cristi</name> <surname>kevin</surname> </user> 

Спасибо.

+1

Это не имеет ничего общего с JAX-WS, вам нужно только JAXB (теги правильно, но вы упоминаете JAX-WS в тексте). –

ответ

8

Найдено :)

public void toXml() { 
    try { 
     JAXBContext ctx = JAXBContext.newInstance(User.class); 
     Marshaller marshaller = ctx.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     marshaller.marshal(this, System.out); 
    } 
    catch (Exception 
      e) { 

       //catch exception 
    } 
} 

Называйте это нравится:

log.info("Customers sent: "+user.toXml()); 
+13

** Никогда ** не пишите пустую блокировку, даже в примере! Примеры имеют неприятную привычку превращаться в производственный код в какой-то момент, и тогда нам нужно поддерживать этот беспорядок. –

17

Вы можете сделать это в качестве общего метода доступного ваших конечных точек.

public String toXml(JAXBElement element) { 
    try { 
     JAXBContext jc = JAXBContext.newInstance(element.getValue().getClass()); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     marshaller.marshal(element, baos); 
     return baos.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }  
    return ""; 
} 
2

Установка Marshaller.JAXB_FORMATTED_OUTPUT может быть непригодной для регистрации.

Вместо этого подавить XML Prolog (or Declaration) с Marshaller.JAXB_FRAGMENT.

public static <J> String printXml(final J instance) throws JAXBException { 
    return printXml(instance, instance.getClass()); 
} 


public static <J> String printXml(final J instance, 
            final Class<?>... classesToBeBound) 
    throws JAXBException { 

    final JAXBContext context = JAXBContext.newInstance(classesToBeBound); 

    final ByteArrayOutputStream output = new ByteArrayOutputStream(); 

    final Marshaller marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
    marshaller.marshal(instance, output); 
    // output.flush(); // Nasty IOException 
    final String jaxbEncoding = (String) marshaller.getProperty(
     Marshaller.JAXB_ENCODING); 

    try { 
     return new String(output.toByteArray(), jaxbEncoding); 
    } catch (UnsupportedEncodingException uee) { 
     throw new RuntimeException(uee); 
    } 
} 

будет печатать одну строку следующим образом.

<user><name>cristi</name><surname>kevin</surname></user> 
+2

Поскольку такой метод, скорее всего, используется для выходных данных журнала, я бы не выбрал, а вместо этого поймал все Исключение, запустил его (либо в журнал или на консоль), и вернул экземпляр «+». – Heri

0
public String toXml(Event event) { 

    ByteArrayOutputStream baos = null; 

    try { 

     JAXBContext jc = JAXBContext.newInstance(event.getClass()); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

     baos = new ByteArrayOutputStream(); 
     marshaller.marshal(event, baos); 
     return baos.toString(); 
    } catch (JAXBException e) { 
     LOGGER.log(Level.SEVERE, " problem in Logging raw XML :"+e.getMessage()); 
    }  
    return baos.toString(); 

Это работает хорошо