无法在自定义登录模块中注入dao

时间:2015-04-24 10:56:31

标签: java maven jboss wildfly weld2

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

代码段如下。

MyLoginModule

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>        

的beans.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>

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

2 个答案:

答案 0 :(得分: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,以防原始帖子消失。

答案 1 :(得分:1)

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

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

相关问题