Java 使用Jersey 2和ApacheShiro的HK2依赖注入

Java 使用Jersey 2和ApacheShiro的HK2依赖注入,java,dependency-injection,shiro,jersey-2.0,hk2,Java,Dependency Injection,Shiro,Jersey 2.0,Hk2,我正在使用Jersey 2.5.1创建一个rest api。我正在使用HK2进行依赖注入。后来,我决定使用ApacheShiro进行身份验证和授权 在创建自己的自定义Shiro领域时,我遇到了一些问题。在我的领域中,我想注入一个依赖项。但是,当我运行我的应用程序时,依赖关系没有得到解决 以下是我的设置: web.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/X

我正在使用Jersey 2.5.1创建一个rest api。我正在使用HK2进行依赖注入。后来,我决定使用ApacheShiro进行身份验证和授权

在创建自己的自定义Shiro领域时,我遇到了一些问题。在我的领域中,我想注入一个依赖项。但是,当我运行我的应用程序时,依赖关系没有得到解决

以下是我的设置:

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>my.app.api.MyApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
MyApplication.java

public class MyApplication extends ResourceConfig {
   public MyApplication() {
      register(new ApplicationBinder());
      packages(true, "my.app.api");
   }
}
ApplicationBinder.java

public class ApplicationBinder extends AbstractBinder {
   @Override
   protected void configure() {
      bind(UserDAO.class).to(new TypeLiteral<Dao<User>>(){});
      bind(RealDatasource.class).to(DataSource.class);
   }
}



所以,问题是源代码没有注入MyCustomRealm。所有其他不是由Shiro创建的类都会被注入依赖项。
问题可能是Shiro正在通过ini文件创建我的CustomRealm吗?

我在MyCustomRealm中看到的一个问题是,您希望在构建时填充数据源。解决这个问题有两种方式,;一种是使用构造函数注入,另一种是使用后期构造。这里将使用构造函数注入:

public class MyCustomRealm extends JdbcRealm {

   private final DataSource source;

   @Inject
   public MyCustomRealm(DataSource source) {
      super();

      this.source = source;

      // source does not get injected
      setDataSource(source);
   }
}
以下是施工后的处理方法:

public class MyCustomRealm extends JdbcRealm {

   @Inject DataSource source;

   public MyCustomRealm() {
      super();
   }

   @javax.annotation.PostConstruct
   private void postConstruct() {
      // source does not get injected
      setDataSource(source);
   }
}

我在MyCustomRealm中看到的一个问题是,您希望在构建时填充数据源。解决这个问题有两种方式,;一种是使用构造函数注入,另一种是使用后期构造。这里将使用构造函数注入:

public class MyCustomRealm extends JdbcRealm {

   private final DataSource source;

   @Inject
   public MyCustomRealm(DataSource source) {
      super();

      this.source = source;

      // source does not get injected
      setDataSource(source);
   }
}
以下是施工后的处理方法:

public class MyCustomRealm extends JdbcRealm {

   @Inject DataSource source;

   public MyCustomRealm() {
      super();
   }

   @javax.annotation.PostConstruct
   private void postConstruct() {
      // source does not get injected
      setDataSource(source);
   }
}

我在MyCustomRealm中看到的一个问题是,您希望在构建时填充数据源。解决这个问题有两种方式,;一种是使用构造函数注入,另一种是使用后期构造。这里将使用构造函数注入:

public class MyCustomRealm extends JdbcRealm {

   private final DataSource source;

   @Inject
   public MyCustomRealm(DataSource source) {
      super();

      this.source = source;

      // source does not get injected
      setDataSource(source);
   }
}
以下是施工后的处理方法:

public class MyCustomRealm extends JdbcRealm {

   @Inject DataSource source;

   public MyCustomRealm() {
      super();
   }

   @javax.annotation.PostConstruct
   private void postConstruct() {
      // source does not get injected
      setDataSource(source);
   }
}

我在MyCustomRealm中看到的一个问题是,您希望在构建时填充数据源。解决这个问题有两种方式,;一种是使用构造函数注入,另一种是使用后期构造。这里将使用构造函数注入:

public class MyCustomRealm extends JdbcRealm {

   private final DataSource source;

   @Inject
   public MyCustomRealm(DataSource source) {
      super();

      this.source = source;

      // source does not get injected
      setDataSource(source);
   }
}
以下是施工后的处理方法:

public class MyCustomRealm extends JdbcRealm {

   @Inject DataSource source;

   public MyCustomRealm() {
      super();
   }

   @javax.annotation.PostConstruct
   private void postConstruct() {
      // source does not get injected
      setDataSource(source);
   }
}

我遇到了一个类似的问题,虽然这可能不再是您的问题,但我想提供我使用的解决方案

问题是
MyCustomRealm
的所有权。shiro在
org.apache.shiro.web.env.EnvironmentLoaderListener
中通过读取Jersey servlet中hk2提供程序范围之外的ini文件来创建它

依赖项注入仅在对象由hk2的ServiceLocator提供时进行——shiro不知道该定位器,只使用默认构造函数构造了
MyCustomRealm
的实例

我通过实现一个
org.glassfish.jersey.server.spi.ContainerLifecycleListener
来解决这个问题,它可以获得ServiceLocator和shiro的SecurityManager的句柄(通过
ServletContext
注册到
ServiceLocator
)。然后手动将数据注入shiro创建的领域


如果您感兴趣,我可以将代码作为要点发布。

我遇到了类似的问题,虽然这可能不再是您的问题,但我想提供我使用的解决方案

问题是
MyCustomRealm
的所有权。shiro在
org.apache.shiro.web.env.EnvironmentLoaderListener
中通过读取Jersey servlet中hk2提供程序范围之外的ini文件来创建它

依赖项注入仅在对象由hk2的ServiceLocator提供时进行——shiro不知道该定位器,只使用默认构造函数构造了
MyCustomRealm
的实例

我通过实现一个
org.glassfish.jersey.server.spi.ContainerLifecycleListener
来解决这个问题,它可以获得ServiceLocator和shiro的SecurityManager的句柄(通过
ServletContext
注册到
ServiceLocator
)。然后手动将数据注入shiro创建的领域


如果您感兴趣,我可以将代码作为要点发布。

我遇到了类似的问题,虽然这可能不再是您的问题,但我想提供我使用的解决方案

问题是
MyCustomRealm
的所有权。shiro在
org.apache.shiro.web.env.EnvironmentLoaderListener
中通过读取Jersey servlet中hk2提供程序范围之外的ini文件来创建它

依赖项注入仅在对象由hk2的ServiceLocator提供时进行——shiro不知道该定位器,只使用默认构造函数构造了
MyCustomRealm
的实例

我通过实现一个
org.glassfish.jersey.server.spi.ContainerLifecycleListener
来解决这个问题,它可以获得ServiceLocator和shiro的SecurityManager的句柄(通过
ServletContext
注册到
ServiceLocator
)。然后手动将数据注入shiro创建的领域


如果您感兴趣,我可以将代码作为要点发布。

我遇到了类似的问题,虽然这可能不再是您的问题,但我想提供我使用的解决方案

问题是
MyCustomRealm
的所有权。shiro在
org.apache.shiro.web.env.EnvironmentLoaderListener
中通过读取Jersey servlet中hk2提供程序范围之外的ini文件来创建它

依赖项注入仅在对象由hk2的ServiceLocator提供时进行——shiro不知道该定位器,只使用默认构造函数构造了
MyCustomRealm
的实例

我通过实现一个
org.glassfish.jersey.server.spi.ContainerLifecycleListener
来解决这个问题,该函数获取ServiceLocator和