gpt4 book ai didi

dependency-injection - 分层架构中的 CDI。如何使用 CDI 注释注入(inject)服务对象?

转载 作者:行者123 更新时间:2023-12-04 20:52:59 28 4
gpt4 key购买 nike

我正在开发一些应用程序,它由三层组成:

  • 数据库访问层(JPA + Hibernate 作为提供者)
  • 业务逻辑层
  • 表示层 (JSF 2.0)

  • 在开始之前,我已经阅读了 David Geary 和 Cay S. Horstmann 所著的 Core JavaServer Faces (3rd Edition) 一书中的一些章节。在本书中,作者强烈推荐使用 @Named注释而不是 @ManagedBean .好吧,我想我可以试试。

    然后我通过实现一些基本功能(用户登录)继续对我的应用程序进行分层构建。

    我还阅读了一些新注释,即 @Inject .我认为仅基于接口(interface)将一层注入(inject)另一层会很舒服。但是我怕我误会了什么,所以我带着我的问题来找你。

    让我介绍一下我的代码的一些部分:

    CredentialsBean.java :
    @Named("userCredentials")
    public class CredentialsBean {
    @Inject
    AccountService accountService;

    private String login;
    private String password;

    public String verify()
    {
    if (accountService.verifyCredentials(login, password))
    return "success";
    else
    return "failure";
    }
    // getters and setters
    }

    AccountService.java :
    public interface AccountService {
    public Boolean verifyCredentials(String login, String password);
    }

    AccountServiceImpl.java:
    public class AccountServiceImpl implements AccountService {
    @Inject
    AccountDAO dao;

    @Override
    public Boolean verifyCredentials(String login, String password) {
    // some logic
    }
    }

    AccountDAO.java :
    public interface AccountDAO {
    public Account getAccount(String login);
    }

    AccountDAOImpl.java :
    public class AccountDAOImpl implements AccountDAO {
    @PersistenceContext(unitName = "MyApp")
    protected EntityManager em;

    public EntityManager getEntityManager() {
    return em;
    }

    @Override
    public Account getAccount(String login) {
    // some data processing
    }
    }

    最后一个类使用 @Entity 对某个 Java 类进行操作。注释,没关系。

    我感觉我的解决方案有问题。

    基本错误是事实,即使我向使用 <h:form> 创建的表单提供了一些数据, <h:inputText>标签,调试时 verify()我可以看到的方法, loginpasswordnull ,所以这里出了点问题,但我不知道是什么。

    如果我理解 @Inject,我也会担心好。我可以像上面提供的那样使用它来使用接口(interface)耦合层吗?

    行。我找到了登录和密码字段为空的原因,但我还不知道解决方案。
    这是因为在以某种神奇的方式执行期间,创建了多个(至少两个)CredentialsBean 实例。在 Eclipse 调试器中检查。第一个正确设置其字段,但第二个没有,第二个的值被发送到服务层。
    我想知道这是否不是范围问题。我不应该将@SessionScoped 放在 CredentialsBean 中吗?

    最佳答案

    我相信问题出在您的 CredintialsBean 类上。您没有为 bean 指定范围,因此它使用默认范围(参见 What is the default scope of a Named CDI bean? 了解更多信息)。

    如果您将 @RequestScoped 之类的内容添加到您的类(class)中,它应该可以工作。确保使用 javax.enterprise.context.RequestScoped 而不是 javax.faces 版本。

    关于dependency-injection - 分层架构中的 CDI。如何使用 CDI 注释注入(inject)服务对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8231849/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com