gpt4 book ai didi

java - 使用继承和泛型组织 Jersey 资源的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:32 26 4
gpt4 key购买 nike

我正在使用 Jersey 开发一个应用程序,我有很多资源。尽管这些资源的主要功能各不相同,但它们共享许多通用方法(如列表、读取、更新等)。该应用程序在 Google App Engine 上运行,并使用 Guice 进行依赖注入(inject)。

我的第一个方法是拥有一个包含所有通用逻辑的通用 AbstactResource,并且它分别由所有其他资源扩展,这些资源添加了它们所需的自定义方法。

public class AbstractResource<T> {

@GET
public ListPage<T> list(@QueryParam("limit") Integer limit,
@QueryParam("start") Integer start) {
// ... implementation
}

@GET
@Path("/{id}")
public T get(@PathParam("id") Long id) {
// ... implementation
}

示例资源如下所示:

public class TenantResource extends AbstractResource<Tenant> {
// custom resource related methods here
}

在这种情况下一切正常。当我再添加一层抽象时,问题就出现了。假设我只想为我的某些资源存储历史记录和变更日志。我创建了一个扩展 AbstractResource 的抽象类,称为 AudiatableResource,它添加了所需的功能。

public abstract class AuditableResource<T extends AuditableModel> 
extends AbstractResource {
// here I override update and create methods to save changelogs
}

如您所见,本例中的类型参数已更改(现在它扩展了 AuditableModel)。

新的具体资源将如下所示:

public class PropertyResource extends AuditableResource<Tenant> {
// custom resource related methods here
}

在这种情况下,一切仍然有效,但这次我在启动时收到很多警告消息:

WARNING: Return type T of method public T com.pkg.AbstractResource.get(java.lang.Long) is not resolvable to a concrete type
WARNING: Return type T of method public T com.pkg.AbstractResource.getNew() is not resolvable to a concrete type
WARNING: Return type com.pkg.data.ListPage<T> of method public com.pkg.ListPage<T> com.pkg.AbstractResource.list(java.lang.Integer,java.lang.Integer) is not resolvable to a concrete type

我真的想知道使用 Jersey 这种方法是否正确,我是否可以忽略此消息。了解在大量资源的情况下如何组织资源会很有趣。

最佳答案

一种方法是将资源的定义与实现分开。

  • 拥有非常简单的资源类,定义您要提供的不同服务。这样,您通过 rest 公开的 API 很容易被定位和审计。不同的方法可能是委托(delegate)给一个实现类
  • 在实现中实现资源的业务逻辑,您可能希望在其中使用继承来考虑常见行为。

您在运行时收到这些消息的原因是 jersey 使用有关资源类型的运行时信息。泛型类型信息在编译时被删除,无法获取泛型类方法的实际返回类型。如果您为您的实现提供一个 REST“外观”,您可以明确这一点。

public class Facade {
private final PropertyResource propertyResource;
public Facade() {
propertyResource = new PropertyResource();
}
@GET
@Path("somepath")
public Tenant something() {
return propertyResource.something();
}
}

关于java - 使用继承和泛型组织 Jersey 资源的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com