当前位置: 首页 > 面试题库 >

通过GenericEntity在RESTful Response对象中使用Java泛型模板类型>

吴飞语
2023-03-14
问题内容

我有一个通用的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响应模型