当前位置: 首页 > 知识库问答 >
问题:

无法将@Stateless EJB注入CDI bean(多模块)Jakarta EE 8

须捷
2023-03-14

将遗留项目迁移到雅加达 EE 8(在 Wildly 26 上构建 Maven EAR)我正在努力使依赖项注入从我的实体模块(EJB 打包)工作到 WAR 模块,maven 项目结构是:

-WebApp.ear
    -WebApp-entities.jar
    -WebApp-ejb.jar
    -WebApp-web.war
    -WebApp-mobile.war
    -WebApp-api.war

该结构是基于Wildfly-jakartaee8-with-tools原型创建的

我要注入的DAO是一个@Stateless豆,它使用@LocalBean无接口例如。

@Named
@LocalBean
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserDAO extends GenericDAOBean<User,Long> {

    @PersistenceContext(unitName="ReadOnlyDatabase")  private EntityManager readOnlyEntityManager;
    
    /**
     * Default constructor
     */
    public UserDAO() {
        //Super call to construct AbstractDAO
        super();
    }
    
    public User findNonDeletedByEmail(String email){
        String s = "from User where email = :email and disabled = false";
        Query query = this.getEntityManager().createQuery(s);
        query.setParameter("email", email);
        try{
            return (User)query.getSingleResult();
        }catch(NoResultException nre){
            return null;
        }catch(Exception e){
            return null;
        }
    }
    
}

我的 CDI 代码是 WAR 模块中的标准@RequestScoped bean,它试图注入 DAO 来执行登录

@Named
@RequestScoped
public class LoginBean implements Serializable {


private static final long serialVersionUID = 1504441323094295359L;

@Inject private SecurityContext securityContext;
@Inject private UserDAO userDAO;
@Inject private FacesContext facesContext;
@Inject private ExternalContext externalContext;

private String username, password;

public void login() throws IOException {
  
    Credential credential = new UsernamePasswordCredential(username, new Password(password));
  
    User user = userDAO.findByEmailForUserLogin(username);
   AuthenticationStatus status = securityContext.authenticate(
           getRequest(facesContext),
           getResponse(facesContext),
           AuthenticationParameters.withParams()
                   .credential(credential));
  
   switch (status) {
       case SEND_CONTINUE:
           facesContext.responseComplete();
           break;
       case SEND_FAILURE:
           facesContext.addMessage(null,
                   new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login failed", null));
           break;
       case SUCCESS:
           facesContext.addMessage(null,
                   new FacesMessage(FacesMessage.SEVERITY_INFO, "Login succeed", null));
           externalContext.redirect(externalContext.getRequestContextPath() + "/user/home.xhtml");
           break;
       case NOT_DONE:
   }
  
}

private static HttpServletResponse getResponse(FacesContext context) {
   return (HttpServletResponse) context
       .getExternalContext()
       .getResponse();
}

private static HttpServletRequest getRequest(FacesContext context) {
   return (HttpServletRequest) context
       .getExternalContext()
       .getRequest();
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

当我从JSF页面调用login()方法时,我得到以下错误:

Target Unreachable, identifier 'loginBean' resolved to null: javax.el.PropertyNotFoundException

如果我注释掉userDAO注入,方法调用ok,所以我知道是UserDAO导致了问题,没有其他错误

在服务器启动日志中,我可以看到UserDAO已注册,例如:

    java:global/WebApp/Web-entities/UserDAO!com.webapp.dao.beans.UserDAO
java:app/Web-entities/UserDAO!com.webapp.dao.beans.UserDAO
java:module/UserDAO!com.webapp.dao.beans.UserDAO
java:global/WebApp/Web-entities/UserDAO
java:app/Web-entities/UserDAO
java:module/UserDAO

我有豆子.xml在/web-inf/bean中定义.xml(战争)和/元-inf/bean.xml(jar)都使用豆子发现模式=“注释”

在WAR.pom中,我的EJB模块作为maven依赖项包含在<code>中

我也尝试过使用@EJB进行注入,但有相同的错误

更新:

我通过设置<code>发现

共有1个答案

万开畅
2023-03-14

通过向jboss-deployment-structure.xml中的EJB和实体模块添加模块依赖关系,最终实现了这一点,如下所示...

<sub-deployment name="WebApp-web.war">
    <dependencies>
        <module name="deployment.WebApp.ear.WebApp-entities.jar" />
        <module name="deployment.WebApp.ear.WebApp-ejb.jar" />
    </dependencies>
  </sub-deployment>

注入到WAR现在可以正常工作,但在传统的EE 6/JBoss 7应用程序中不需要这样做,因此类加载行为必须已经改变

 类似资料:
  • 看完这些,, 在哪里使用EJB3.1和CDI 下面的事情我还不明白,如果我错了,请纠正我。 与bean在同一个包中的所有类。xml是CDIBean,除了注释为session/message/singleton的类之外 非常感谢。:)

  • 我正在学习企业应用程序开发课程。我是JSF的新手。我正在尝试使用 Glassfish 3.1 使用 JSF 和 Netbeans IDE 部署我的应用程序。 下面列出了我得到的错误。 < code >部署期间出错:准备应用程序时出现异常:无法加载EJB模块。DeploymentContext不包含任何EJB。检查归档文件以确保F:\ Seagate \ docs backup \ netbeans

  • 我配置了一个bean,它有一些初始化逻辑。我已经使用@Application ationScoped注释注释了这个bean。但不知何故,cdi并没有选择这个豆子。 beans.xml内容: Bean文件: 读取配置文件的代码: 我使用:cdiL:进行依赖项注入,apachedeltaspike:读取配置文件。野蝇群:服务器

  • 问题内容: 假设我有一个我没有源代码的库(或者它是用某种尚未意识到模块的非Java语言编写的)。没有,我不想将其用作自动模块,所以我想注入它。 我首先使用以下命令生成: 假设这生成了这样的内容: 然后,我尝试编译它,但是由于软件包和不存在而失败: 当然,我可以创建目录并在其中创建虚拟类,但是有更好的方法吗? 问题答案: 是的,使用该选件是可能的。此选项最常在运行时使用,但在编译时也可以使用:

  • 我有以下3个模块在我的Spring启动应用程序: web(入口点/主应用程序类,用 坚持 服务 我现在正试图在模块中注入一个来自的服务。在这个服务中,我注入了来自模块的存储库。启动应用程序时,会出现以下错误: ImageService类: class: 这就是我在模块中将服务注入到我的类中的方式: 所以我在网上搜索,看到一些人有类似的问题。然后我得到了一个提示,我应该在我的应用程序类中将scanB

  • 让我们创建一个名为的新模块,并在那里定义CounterService。 app/shared/shared.module.ts 现在我们将引入 SharedModule 到AppModule 和中。 app/lazy/lazy.module.ts 使用此配置,两个模块的组件都可以访问CounterService。 我们将以完全相同的方式在EagerComponent和LazyComponent中使