RestEasy JAXB - выставлять сторонние классы в XML - PullRequest
2 голосов
/ 18 октября 2011

Я новичок в RestEasy и JAXB. Я думаю, что их довольно легко использовать, поскольку вы контролируете все источники, которые хотите предоставить через веб-сервис.

Но теперь у меня проблема. У меня есть объекты передачи данных, которые я не могу (не должен) аннотировать с помощью аннотаций JAXB, но я все еще хочу, чтобы они преобразовывались в XML.

Какой самый простой способ или лучший способ сделать это?

Любая помощь или комментарий приветствуется.

Балаш

Ответы [ 2 ]

1 голос
/ 24 января 2013

У меня была та же проблема: я получил извлеченные объекты (уже с реальными данными) из уровня персистентности, но они были из сторонних классов, которые я не мог ни аннотировать с помощью @XmlRootElement, ни изменять код выборки.

Мне, просто завернув их в JAXBElement, удалось.Итак, метод RESTful:

@GET
@Path("/listAll")
@Produces(MediaType.APPLICATION_XML); // "application/xml"
public List<Person> getPersonList() {
   return persistenceLayer.fetchAllPerson();
}

Работает при изменении на:

@GET
@Path("/listAll")
@Produces(MediaType.APPLICATION_XML); // "application/xml"
public List<JAXBElement<Person>> getPersonList() {
   List<Person> ps = persistenceLayer.fetchAllPerson();
   List<JAXBElement<Person>> jaxbeps = new ArrayList<JAXBElement<Person>>(ps.size());
   for (Person p : ps) {
       jaxbeps.add(jaxbeWrapp(p));
   }
   return jaxbeps;
}

и используется общий метод (вы, конечно, можете просто встроить его):

public  static <T> JAXBElement<T> jaxbeWrapp(T obj) {
    Class<T> clazz = (Class<T>)  obj.getClass();
    return new JAXBElement<T>(new QName(obj.getClass().getName().toLowerCase()), clazz, obj);
}

Вот и все!Надеюсь, это поможет!

0 голосов
/ 18 октября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.

Для предоставления метаданных вы можете использовать расширение JAXB документа отображения MOXy.Тогда вы можете использовать ContextResolver в JAX-RS для начальной загрузки JAXBContext.

package blog.bindingfile.jaxrs;

import java.io.*;
import java.util.*;

import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

import blog.bindingfile.Customer;

@Provider
@Produces({"application/xml", "application/json"})
public class CustomerContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext jc;

    public CustomerContextResolver() {
        ClassLoader cl = Customer.class.getClassLoader();
        Map<String, Object> props = new HashMap<String, Object>(1);
        props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "blog/bindingfile/binding.xml");
        jc = JAXBContext.newInstance(new Class[] {Customer.class} , props);
   }

    public JAXBContext getContext(Class<?> clazz) {
        if(Customer.class == clazz) {
            return jc;
        }
        return null;
    }

} 

Для подробного примера

...