gpt4 book ai didi

java - 泽西自定义上下文注入(inject)

转载 作者:搜寻专家 更新时间:2023-11-01 03:20:24 25 4
gpt4 key购买 nike

我尝试像 this answer 中那样实现自定义上下文注入(inject):

@Provider
public class DaoContextProvider extends SingletonTypeInjectableProvider<Context,Bar> {

public DaoContextProvider() {
super(Bar.class, new Bar("haha"));
}

}

这是我的 Controller 类,我想注入(inject)我的上下文:

@Path("foo")
public class Foo {

@Context
private Bar message;

@GET
public String index() {
return String.format("%s", message );
}

}

但响应消息为空。

我尝试按照建议将我的上下文提供程序添加到单例中:

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {

public ApplicationConfig() {
getSingletons().add(new DaoContextProvider());
}
//...

但是后来我的工件甚至没有部署,并给我提供了这个错误:

Artifact server:war exploded: java.io.IOException: com.sun.enterprise.admin.remote.RemoteFailureException: Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.UnsupportedOperationException. Please see server.log for more details.

我会提供 server.log,如异常中所述,但我不知道在哪里可以找到此日志。

最佳答案

getSingletons() 返回的集合是不可修改的。相反,我们需要重写该方法

@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<>();
singletons.add(new new DaoContextProvider());
return singletons;
}

请注意,与 Jersey 特定方式相比,直接的 Application 子类在功能上受到限制。在 Jersey ,首选方法是使用 ResourceConfig子类(实际上是 Application 的子类)。例如(您可以使用 PackagesResourceConfig 扫描包裹)。

@ApplicationPath("/webresources")
public class AppConfig extends PackagesResourceConfig {

public AppConfig() {
// scans the package and sub-packages.
super("package.where.all.your.resource.and.providers.are");
getProperties().put("some properites", "to set");
getContainerRequestFilters().add(new SomeFiltersToRegister());
getProviderSingletons().add(new SomeProvidersToAdd());
// see the ResourceConfig API for more methods.
}
}

这将扫描 @Path@Provider 注释类,因此我们不需要显式注册所有内容。尽管某些提供商需要明确注册。不过,您的特定提供商不需要注册。它是我在包裹扫描中捡到的。


更新

好的,既然您说您使用的是 Glassfish 4.1,那么您首先应该了解的是 Glassfish 4 使用 Jersey 2.x。因此,您应该摆脱任何 Jersey 1.x 依赖项/jar。仅使用 Jersey 2.x 依赖项,并确保它们只是编译时依赖项,因为您不希望版本冲突导致 Glassfish 已经有一个版本。

这意味着您当前的 DaoContextProvider 实现将不起作用。 SingletonTypeInjectableProvider 是 Jersey 1.x 类,Jersey 2.x 运行时将忽略它。

在 Jersey 2.x 中,有几种配置可注入(inject)对象的方法。一种方法是为对象创建一个 Factory。例如。

public class DaoContextProvider implements Factory<Bar> {

@Override
public Bar provide() {
return new Bar("boo hoo!");
}

@Override
public void dispose(Bar bar) {}
}

在 Jersey 2.x 中,ResourceConfig 的 API 发生了变化,我们可以直接扩展它。例如

@ApplicationPath("/webresources")
public class AppConfig extends ResourceConfig {

public AppConfig() {

packages("com.stackoverflow.jersey");

register(new AbstractBinder(){
@Override
protected void configure() {
bindFactory(DaoContextProvider.class)
.to(Bar.class)
.in(RequestScoped.class);
}
});
}
}

你可以看到AbstractBinder。这就是我们向 Bar 类注册 DaoContextProvider 的方式。所以现在可以将 Bar 注入(inject)到您的资源类中。

唯一需要将其他所有内容拉入的 Maven 依赖项是

<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.19</version>
<scope>provided</scope>
</dependency>

注意提供的范围,这样它就不会被构建到 war 中。如果您不使用 Maven,则获取 Jersey JAX-RS 2.0 RI bundle 中的所有 jar。 .请记住,您应该只使它们成为编译时依赖项。他们不应该被卷入 war 。

另请参阅:

关于java - 泽西自定义上下文注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32119962/

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