【问题标题】:Generic Crud Restfull Service通用 Crud 宁静服务
【发布时间】:2012-10-30 06:35:39
【问题描述】:

我是一名高级 Java 开发人员(也是 stackoverflow 中的新手),从事客户端-服务器项目:

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

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

所以我尝试拥有一个具有 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();
     }

}

在客户端 web 项目中,我有这样的东西:

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 和 google 的 gson api 中尝试了 GenericEntity 和 GenericType,但没有成功。

我们将不胜感激。

【问题讨论】:

    标签: rest jakarta-ee jersey ejb-3.1


    【解决方案1】:

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

    我猜你想GET 某种资源的所有实例。在 RESTful 服务中,资源与 Java 类无关。所以如果你想要一个 generic 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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-06
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多