我是RestEasy和JAXB的新手。我认为只要您通过Web服务控制所有要显示的源代码,它们就非常容易使用。
但现在我遇到了问题。我有数据传输对象,我不能(不应该)使用JAXB注释进行注释,但我仍然希望它们编组为XML。
最简单的方法或最佳做法是什么?
感谢任何帮助或评论。
巴拉兹
答案 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;
}
}
详细示例