Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义上下文注入_Java_Jakarta Ee_Dependency Injection_Jersey_Jax Rs - Fatal编程技术网

Java 自定义上下文注入

Java 自定义上下文注入,java,jakarta-ee,dependency-injection,jersey,jax-rs,Java,Jakarta Ee,Dependency Injection,Jersey,Jax Rs,我尝试实现自定义上下文注入,如中所示: 但作为响应,消息为空 我尝试将我的上下文提供程序添加到Singleton,建议如下: @javax.ws.rs.ApplicationPath("webresources") public class ApplicationConfig extends Application { public ApplicationConfig() { getSingletons().add(new DaoContextProvider());

我尝试实现自定义上下文注入,如中所示:

但作为响应,消息为空

我尝试将我的上下文提供程序添加到Singleton,建议如下:

@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,如exception中所述,但我不知道在哪里可以找到此日志。

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

@Override
public Set<Object> getSingletons() {
    Set<Object> singletons = new HashSet<>();
    singletons.add(new new DaoContextProvider());
    return singletons;
}
这将扫描
@Path
@Provider
注释类,因此我们不需要显式注册所有内容。尽管有些提供者需要明确注册。但是,您的特定提供商不需要注册。我在包裹扫描中发现的


更新 既然你说你使用的是GlassFish4.1,那么首先你应该明白GlassFish4使用的是Jersey 2.x。因此,任何Jersey 1.x依赖项/jar都应该去掉。仅使用Jersey 2.x依赖项,并确保它们仅为编译时依赖项,因为您不希望冲突的版本进入Glassfish,因为Glassfish已经有了它们的版本

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

在Jersey 2.x中,有几种方法可以配置可注入对象。一种方法是为对象创建
工厂
。比如说

public class DaoContextProvider implements Factory<Bar> {

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

    @Override
    public void dispose(Bar bar) {}
}
您可以看到
AbstractBinder
。这就是我们如何在
Bar
类中注册
DaoContextProvider
。所以现在可以将
Bar
注入到资源类中

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

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

org.glassfish.jersey.containers
. 请记住,您应该使它们仅成为编译时依赖项。他们不应该被卷入战争

另请参见:


当前如何注册
Foo
资源类?在同一
ApplicationConfig
类中,或通过web.xml包扫描属性?@peeskillet在application configMy PackageResourceConfig类中没有getSingletonProviders方法,而是有一个具有类似名称GetProviderSingleton的方法。我试着使用它,也试着不使用它,但它不起作用。也试着覆盖“GetSingleton”,也没用。可能是我的Provider类有问题,或者@Context注释有问题?是的,很抱歉拼写错误。但我用泽西1.19测试了两种方法,它们都很好。我用你的代码测试过。当然,你正在把它应用到GalasFISH 3×x GalsFISH 4.1,泽西1.XI可能误导了你,GigStILSONS方法可能奏效了,我测试错了。然而,第二种方法没有
@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.
    }
}
public class DaoContextProvider implements Factory<Bar> {

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

    @Override
    public void dispose(Bar bar) {}
}
@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);
            }
        });
    }
}
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.19</version>
    <scope>provided</scope>
</dependency>