2

私はクライアントサーバープロジェクトに取り組んでいるシニアJava開発者(stackoverflowの新人でもあります)です:

  • サーバー:javaee6 Webプロジェクト(Rest、EJB3.1、JPA)
  • クライアント:javaee6 Webプロジェクト(JSF2.0)およびAndroidデバイス。クライアントは次のことを要求します:Crudといくつかのストアドプロシージャの実行。
  • エンティティ:これらはすべてJavaプロジェクトにあり、JPAとeclipse-linkをプロバイダーとして、JAXBアノテーションを使用して生成されたエンティティクラスがあります。そのjarファイルはサーバープロジェクトに追加されており、クライアントによっても使用されます。

すべてのエンティティについて、クライアントはエンティティのクラスタイプを渡すだけで、必要な機能を備えています。

そこで、RestfulメソッドfindAllを持つ汎用セッション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

私はたくさん検索しました。ジャージAPIとグーグルのgsonAPIでGenericEntityとGenericTypeを試しましたが、うまくいきませんでした。

どんな助けでもありがたいです。

4

1 に答える 1

1

あなたのメソッドは呼び出されfindAllますが、受け入れますPUT。それは RESTful サービスの構築方法ではありません。

GETある種のリソースのすべてのインスタンスが必要だと思います。RESTful サービスでは、リソースは 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 ではありません!

于 2012-10-30T10:25:06.593 に答える