0

我有一个在 Wildfly 中运行的 Web 应用程序,它使用 Spring 和 JPA。现在我将应用程序的登录模块作为 JBoss 中的自定义模块移动。

代码片段如下。

我的登录模块

public class MyLoginModule extends AbstractServerLoginModule
{

private Principal caller;
private char[] credential;
private String[] roleList;

@Inject
@DaoQualifier
private Dao dao;    


@Override
public void initialize(Subject subject, CallbackHandler callbackHandler,
          Map sharedState, Map options) {
    super.initialize(subject, callbackHandler, sharedState, options);

    super.principalClassName = "com.myapp.login.LoginPrincipal";

}

 @Override   
 public boolean login() throws LoginException
 {


  logger.info("inside login "+dao);
  if (super.login())
  {
    ................
  }
  else
  {
      ............
   }
}

}

DaoImpl 类如下所示。

 public class DaoImpl implements Dao {
     @Inject
     private EntityManager em;

     //implementation methods
  }

Pom.xml 依赖项

  <dependencies>        
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.picketbox</groupId>
        <artifactId>picketbox</artifactId>
        <version>4.0.21.Beta1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.1.4.GA</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <scope>provided</scope>
    </dependency>        

豆类.xml

<beans
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="all">
</beans>

当这个 jar 部署在 JBoss/modules 中并启动服务器时,dao 对象始终为 null。我的代码中是否缺少某些内容?

4

2 回答 2

7

正如 hwellmann 所说,登录模块不是托管 bean。他对手动查找也是正确的。我只想为查找添加一个示例代码:

public class CustomLoginModule extends AbstractServerLoginModule {

@Inject
AuthService authService;

@Override
public boolean login() throws LoginException {
    if (authService == null) {
      CdiHelper.programmaticInjection(CustomLoginModule.class, this);
    }

   authService.authenticate();
}...

帮手:

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class CdiHelper {
  // Nicked from: http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html_single/#d0e5286
  public static <T> void programmaticInjection(Class clazz, T injectionObject) throws NamingException {
    InitialContext initialContext = new InitialContext();
    Object lookup = initialContext.lookup("java:comp/BeanManager");
    BeanManager beanManager = (BeanManager) lookup;
    AnnotatedType annotatedType = beanManager.createAnnotatedType(clazz);
    InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType);
    CreationalContext creationalContext = beanManager.createCreationalContext(null);
    injectionTarget.inject(injectionObject, creationalContext);
    creationalContext.release();
  }
}

我引用了这个表格https://developer.jboss.org/thread/196807以防原帖消失。

于 2015-10-14T09:10:51.977 回答
2

登录模块不是托管 bean,因此注入不起作用。您必须从 JNDI 或其他合适的注册中心手动查找您的依赖项。

顺便说一句,Java EE 7 中内置的依赖注入解决方案是 CDI,那么使用 Spring 有什么意义呢?

于 2015-04-24T20:41:21.167 回答