1

我曾使用 Jax WS 并使用 wsgen 和 wsimport 来自动编组自定义类型。我也可以将 wsgen 与 JaxRS 一起使用吗?如果是这样,我应该将 wsgen 生成的文件放在哪里以及如何引用它们?我只是不想自己处理使用 JAXB 并使用 wsgen 作为快捷方式。

4

1 回答 1

1

默认情况下,JAX-RS 实现将使用 JAXB 将域对象与 XML 转换为application/xml媒体类型。在下面的示例中,JAXBContext将在Customer类上创建 a,因为它在 RESTful 操作中显示为参数和/或返回类型。

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;
    }

}
于 2012-10-29T14:46:17.297 回答