通用的Crud Restfull服务



我是高级Java开发人员(也是stackoverflow中的新型),在客户端服务器项目上工作:

  • 服务器:Javaee6 Web项目(REST,EJB3.1,JPA)
  • 客户端:Javaee6 Web项目(JSF2.0)和Android设备。客户将要求:CRUD和执行某些商店程序。
  • 实体:它们都在Java项目中,该项目具有由JPA和Eclipse-link生成的实体类,作为提供商和JAXB注释。它的JAR文件已添加到服务器项目中,也将由客户端使用。

对于每个实体客户

所以我尝试拥有一个具有静止方法的通用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

我搜索了很多。我在泽西API中尝试了通用和普遍性,也尝试了Google的GSON API,但他们没有奏效。

任何帮助将不胜感激。

您的方法称为findAll,但接受PUT。那不是如何建立休息的服务。

我想您想 GET某种类型的资源的所有实例。在恢复的服务中,资源与Java类无关。因此,如果您想要 generic findAll CC_4方法,请执行类似的操作:

@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

记住:休息不是RPC!

最新更新