RestEasy JAXB - 以XML格式展示第三方类

时间:2011-10-18 09:44:42

标签: java rest jaxb marshalling resteasy

我是RestEasy和JAXB的新手。我认为只要您通过Web服务控制所有要显示的源代码,它们就非常容易使用。

但现在我遇到了问题。我有数据传输对象,我不能(不应该)使用JAXB注释进行注释,但我仍然希望它们编组为XML。

最简单的方法或最佳做法是什么?

感谢任何帮助或评论。

巴拉兹

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题:我从持久层获取了实体对象(已经有真实数据),但它们来自第三方类,我无法用@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);
}

就是这样!希望它有所帮助!

答案 1 :(得分:0)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

您可以使用MOXy的映射文档JAXB扩展来提供元数据。然后你可以在JAX-RS中使用ContextResolver来引导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;
    }

} 

详细示例