我有一个通用的 JAX-RS 资源类,并且我已经定义了一个通用的findAll
method
public abstract class GenericDataResource<T extends GenericModel> {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response findAll() {
Query query = em.createNamedQuery(modelClass.getSimpleName()+".findAll");
List<T> list = query.getResultList();
return Response.ok(new GenericEntity<List<T>>(list) {}).build();
}
}
和用户类别:
public class User extends GenericModel {
...
}
这是子类定义的示例:
@Path("users")
public class UserResource extends GenericDataResource<User> {
public UserResource() {
super(User.class);
}
}
我得到以下异常:
com.sun.jersey.api.MessageException: A message body writer for Java class
java.util.Vector, and Java type java.util.List<T>,
and MIME media type application/json was not found exception.
如果我将 T 替换为定义的类,例如User
像这样:
GenericEntity<List<User>>(list)
然后就可以正常工作了。
知道如何让它与通用 T 一起使用吗?
编译源代码后,将通过以下行创建(匿名)类:
new GenericEntity<List<T>>(list) {}
使用类型变量来引用其父级。由于类型变量在运行时没有值,因此不能像这样使用泛型。你被迫通过所谓的类型标记从调用站点。这是一个需要从调用者传递令牌的示例findAll()
,但您也可以在构造函数中要求一个并将其保存在实例变量中:
public abstract class GenericDataResource<T extends GenericModel> {
public Response findAll(GenericEntity<List<T>> token) {
Query query = em.createNamedQuery(modelClass.getSimpleName() + ".findAll");
List<T> list = query.getResultList();
return Response.ok(token).build();
}
}
调用者将发送一个令牌,例如
new GenericEntity<List<User>>() {}
如果您只使用非参数化子类,findAll()
可以利用反射来构建令牌(未经测试,希望您明白):
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response findAll() {
Query query = em.createNamedQuery(modelClass.getSimpleName()+".findAll");
List<T> list = query.getResultList();
return Response.ok(new GenericEntity(list, getType())).build();
}
你必须实施getType()
返回所需的类型。它将是一个子类ParameterizedType http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/ParameterizedType.html能够表示类型List<DAO<User>>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)