我已经与Jax WS合作,并使用了WSGEN和WSIMPORT自动编码自定义类型。我也可以将WSGEN与JAXR一起使用吗?如果是这样,我应该在哪里放置WSGEN生成的文件以及如何引用它们?我只希望自己自己使用jaxb并使用WSGEN作为快捷方式。
默认情况下,JAX-RS实现将使用JAXB将域对象转换为application/xml
媒体类型的XML/从XML转换。在下面的示例中,JAXBContext
将在Customer
类中创建,因为它以参数为参数和/或返回类型。
package org.example;
import java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
@PersistenceContext(unitName="CustomerService",
type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;
@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(Customer customer) {
entityManager.persist(customer);
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Customer read(@PathParam("id") long id) {
return entityManager.find(Customer.class, id);
}
}
在单个类上创建的JAXBContext
还将为所有传统参考类创建元数据,但这可能不会带来您XML架构生成的所有内容。您需要利用JAX-RS上下文解析机构。
package org.example;
import java.util.*;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
@Provider
@Produces("application/xml")
public class CustomerContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext jc;
public CustomerContextResolver() {
try {
jc = JAXBContext.newInstance("com.example.customer" , Customer.class.getClassLoader());
} catch(JAXBException e) {
throw new RuntimeException(e);
}
}
public JAXBContext getContext(Class<?> clazz) {
if(Customer.class == clazz) {
return jc;
}
return null;
}
}