通用Crud Restful Service

时间:2012-10-30 06:35:39

标签: rest java-ee jersey ejb-3.1

我是一名高级Java开发人员(也是stackoverflow的新成员),致力于客户端 - 服务器项目:

  • 服务器:javaee6 web项目(Rest,EJB3.1,JPA)
  • 客户端:javaee6 Web项目(JSF2.0)和Android设备。 客户将要求:Crud和执行一些商店程序。
  • 实体:它们都在java项目中,它具有使用JPA和eclipse-link作为提供程序生成的实体类以及JAXB注释。它的jar文件已添加到服务器项目中,也将由客户端使用。

对于每个实体,客户只需要传递实体的类型,它就会有所需的功能。

所以我尝试使用一个具有Restful方法findAll的Generic Session bean,如下所示:

@Stateless
@Path("/DAOFacad/")
public class DAOFacade<T> {

     @PersistenceContext EntityManager entityManager;

     @PUT
     @Consumes("application/json")
     @Produces("application/json")
     public List findAll(Class type) {
        CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
        cq.select(cq.from(type));
        return entityManager.createQuery(cq).getResultList();
     }

}

在客户端网站项目中,我有类似的内容:

public class Consumer {
    private WebResource webResource;
    private Client client;
    private static final String BASE_URI = "http://localhost:8181/ServerPRS/webresources";

    public Consumer() {
        com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
        client = Client.create(config);
        webResource = client.resource(BASE_URI).path("DAOFacad");
    }

    public <T> T findAll(Class<T> responseType, Object requestEntity) throws UniformInterfaceException {
        return webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).put(responseType, requestEntity);
    }

    public void close() {
        client.destroy();
    }

}

管理人员:

public class AdminContollerMB {

Consumer consumer;
    /**
     * Creates a new instance of AdminContollerMB
     */
    public AdminContollerMB() {
        consumer = new Consumer();
    }

    public List<Bank> getAllBanks(){
        GenericType<List<Bank>> respT = new GenericType<List<Bank>>(){};
        return (List<Bank>) consumer.findAll(respT.getClass(),Bank.class);
    }

但在跑步后我得到错误:

com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class java.lang.Class, and MIME media type, application/json, was not found

我搜索了很多。我在jersey api和谷歌的gson api中尝试了GenericEntity和GenericType,但他们没有成功。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的方法称为findAll,但接受PUT。这不是RESTful服务的构建方式。

我想你想GET某种类型资源的所有实例。在RESTful服务中,Resources与Java类无关。因此,如果您需要通用 findAll GET方法,请执行以下操作:

@GET
public Response findAll(@QueryParam("class") String clazz) {
    List<Object> instances = findAllInstancesOfClazz(clazz);
    return Response.ok(instances).build();
}

调用此方法:

GET http://example.com/DAOFacade/?class=SomeClassName

请记住: REST不是RPC!