0

这是一个使用 Netbeans 开发的 glassfish 上的 jsf 项目。我尝试将我的 bean 连接到我的常规 java 类。

这是我的理解:
- 托管 bean 或它们的 CDI 等效项负责处理与 UI 相关的用户数据(例如,用户输入)
- 业务逻辑在常规 Java 类中实现
- 2 个托管 bean 或其 CDI 等效项可以与 @ 通信注射

我缺少的是:bean 如何与常规 java 类通信?(我的业务逻辑在哪里?)
换句话说,我希望我可以通过使用 bean 作为其构造函数的参数来运行我的 java 类!

我试过:
- 在我的java类中包含一个@Inject注释,但这不起作用(bean没有注入,保持为空)
就像

public class myJavaProgram (){
@Inject
UserInputBean userInputBean;
//my business logic using the properties of userInputBean here...  //does not work, userInputBean is null!
}
  • 在我的 java 类的构造函数中将 bean 的属性作为参数传递。有效,但丑陋:为什么我不能简单地将整个 bean 作为参数直接传递给构造函数?但是当我这样做时,我的 java 类中的 bean 上再次出现空指针异常。

    我错过了什么吗?谢谢!
4

2 回答 2

4

现代企业应用程序通常在整个应用程序中使用依赖注入模式,而不仅仅是表示层。因此,您将有一个数据访问层贡献 bean,例如EntityManager. 这些被注入到业务服务中,形成业务服务层。反过来,业务服务被注入到您的 JSF 支持 bean 中。什么依赖注入容器最好是一个争论的问题,你也可以混合它们。

在 Java EE 6 标准中(至少我是这么理解的),EJB 充当数据访问和业务服务层的依赖注入容器,而 CDI 充当表示层的依赖注入容器(这就是您可以在 CDI 中注入 EJB 的原因豆子)。其他人希望替换 EJB 并通过所有层使用 CDI。还有一些人仍然聪明地摆脱了 J2EE 造成的伤害,并使用 Spring 作为依赖注入容器。

给出一些代码,你可以这样做:

@Named
@SessionScoped
public class UserBean {

    @Inject UserService userService;

    User user;

    public void save() {
        userService.create(user);
    }

}

@Stateless
public class UserService {
    public void create(User user) { ... }
}
于 2012-08-14T19:46:09.457 回答
2

我假设当您说 CGI 时,您实际上是指 CDI ......

这是一个 IoC(控制反转)框架,用于促进 JSF 应用程序中的 DI(依赖注入)。这种框架的另一个例子是 Spring,它正在慢慢开始采用更好的 JSF 支持。

如果您打算将业务逻辑与托管 bean 分离为 CDI 注入 bean,那么 JSF 托管 bean 的角色是您的表示逻辑的视图控制器和存储库。

@Inject注释只会注入已通过 CDI 配置的对象,这取决于您的项目设置,实际上可能包含也可能不包含 JSF Managed Beans。这一切都取决于您如何配置项目以及正在使用什么 EL Resolver 实现。如果它是您的 JSF 实现(例如 Mojarra)的默认 EL 解析器,那么正在使用 EL 解析器的 JSF 实现,您的 IoC 将无法识别这些依赖关系。

当然,您仍然可以将托管 bean 依赖注入到其他托管 bean,但您需要通过 EL Resolver 执行此操作。

@ManagedProperty("#{userInputBean}")
UserInputBean userInputBean;

您引用的其他 Java 类依赖项应该代表您的业务逻辑层,并且应该由 CDI 配置和处理。

于 2012-08-14T19:09:51.197 回答