我是一名高级Java开发人员(也是stackoverflow的新成员),致力于客户端 - 服务器项目:
对于每个实体,客户只需要传递实体的类型,它就会有所需的功能。
所以我尝试使用一个具有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,但他们没有成功。
任何帮助将不胜感激。
答案 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!