我有一个通用的JAX-RS资源类,并且定义了一个通用的findAll
方法
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
能够表示类型的子类List<DAO<User>>
现在,当我在地图上迭代时…我能以某种方式获得每个Class1对象的类型(K,V)吗??
在我的Spring Boot应用程序中,我尝试实现模板方法,在我的具体类中,我尝试使用泛型,如下所示: 模板界面:不确定我是否需要使用它? 模板抽象类: 混凝土等级: 我在dto中得到“无法解析‘T’中的方法‘getName’”。getName()行输入AbstractPDFGenerator。 我的问题是: 1.为了解决这个问题,我想从继承和的基类扩展T。但是,我不想从基类继承它们,因为它们没有
我在我们公司做项目,我有一个注入对象的问题。让我们考虑一下我有这个实体提供商: 并使用上面的实体提供程序扩展JPAContainer 问题是(我理解),我无法使用类类型定义@Inject对象,因为Inject方法需要一个空构造函数。这里有什么解决方案吗?如何让它发挥作用?现在我得到了一个例外 非常感谢您的回答:)Ondrej
问题内容: 我想对两个均扩展Number的相同类型的泛型参数执行操作。 可能吗?我一直习惯在泛型参数上调用方法,但使用运算符似乎存在一些问题(对于参数T,T,运算符+未定义)。 我究竟做错了什么? 编辑:我试图改善我的问题。我知道没有为Number类型定义运算符。这件事有点可悲,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好。 但是我仍然不明白一件事:如果没有在
问题内容: 我想知道在Java中专门化泛型类型的选项是什么,即在模板化类中具有对某些类型的特定替代的选项。 在我的情况下,我是一个泛型类(类型T),通常返回null,但是当T为String类型时返回“”(空字符串),而当其Integer类型时返回0(零),等等。 仅提供方法的特定于类型的重载会产生“方法不明确”错误: 例如: 是用特定类型将泛型类子类化的唯一选择(请参见以下示例中的StringBa
我有以下问题。 我必须将json请求解析为包含泛型类型字段的对象。 编辑 我使用常规类类型进行了一些测试(因此我在将其替换为泛型之前使其工作)。现在解析单个元素效果很好。 问题是何时需要从该类中解析出列表对象。 所以我不得不告诉jackson,我的T是list类型,而不仅仅是AlbumModel。 这是我尝试过的。 但是上面的代码不起作用。这种情况的解决方案是什么? 我的泛型类型在List响应模型