gpt4 book ai didi

java - JAX-RS 子资源和 Guice 注入(inject)

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:10:00 25 4
gpt4 key购买 nike

在 JAX-RS 网络应用程序中,我们使用子资源:

@Path("/some/things")
public class ThingsListResource {
@Inject
SomeStorage store;

@GET
public List<Thing> getAllThings() {
return store.getAllThings();
}

@Path("{id}")
public ThingResource getThingResource(@PathParam("id") String id) {
return new ThingResource(id); // PROBLEMATIC
}
}

public class ThingResource {
@Inject
SomeOtherDependecy dep;

@Inject
SomeStorage store;

private final String id;

public ThingResource(String id) {
this.id = id;
}

@GET
public Thing getThisThing() {
return store.getThing(id);
}

@DELETE
public void removeThisThing() {
store.removeThing(id);
}

// following is a list of methods useful enough
// to make ThingResource a useable subresource
}

如您所见,有些注入(inject)是使用 Guice 及其 GuiceResteasyBootstrapServletContextListener 进行的。根资源的依赖注入(inject)没有问题。上面有问题的行用 PROBLEM 标记:子资源是手动创建的,它省略了所有 Guice 注入(inject)。

用 Guice 将依赖项注入(inject)子资源的优雅方法是什么?我可以在这里想到几个选项:

  1. 将注入(inject)器注入(inject)根资源并使用它来创建子资源,可能在子资源中使用一些@Assisted魔法:

    @Inject
    Injector injector

    // ...

    return injector.getInstance(ThingResource.class); // via some provider accepting id?

    但我无法集中精力将“事物”的 id 注入(inject)提供程序或 @Assisted 注入(inject)。此外,看起来这里需要很多 Guice 样板文件。

  2. 忘记子资源的 Guice 管理,将每个依赖项从根资源手动传递给其构造函数。简单但非常像“手动依赖注入(inject)”。

  3. 创建 ThingsListResource 的子资源和内部类,从而让它可以访问外部类(注入(inject)的)字段。不是很可扩展(例如,如果想要有不同的子资源实现通用接口(interface)),但很简单......

  4. 忘记子资源并将它们“升级”为根资源。这有点违反 DRY 规则,因为您将为每个资源指定完整的 URL 路径。

有没有其他方法或更简单的方法来实现上述想法?

最佳答案

这是 assisted inject 的理想用例.您需要定义一个工厂接口(interface):

public interface ThingResourceFactory {
public ThingResource create(String id);
}

然后将其绑定(bind)到您的模块之一:

install(new FactoryModuleBuilder().build(ThingResourceFactory.class));

然后修改 ThingResource 构造函数:

private final String id;

@Inject
public ThingResource(@Assisted String id) {
this.id = id;
}

(顺便说一句,如果我是你,我会使用构造函数注入(inject)而不是字段注入(inject),但这只是旁注)

然后将 ThingResourceFactory 注入(inject)您的 ThingsListResource 并在您的资源方法中使用它:

@Path("/some/things")
public class ThingsListResource {
@Inject
SomeStorage store;

@Inject
ThingResourceFactory thingResourceFactory;

@GET
public List<Thing> getAllThings() {
return store.getAllThings();
}

@Path("{id}")
public ThingResource getThingResource(@PathParam("id") String id) {
return thingResourceFactory.create(id);
}
}

看,几乎没有样板文件而且非常易于使用! Guice 会自动为你创建 ThingResourceFactory 实例,它会将 create() 参数直接传递给类构造函数中的 @Assisted 参数,注入(inject)其他参数/​​字段/methods/etc 用通常的方法。

关于java - JAX-RS 子资源和 Guice 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995910/

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