【问题标题】:JBoss 6: Injecting EJB into servletJBoss 6:将 EJB 注入 servlet
【发布时间】:2011-07-26 17:17:07
【问题描述】:

伙计们,

每次新版本的 JBoss 推出时,我都不得不重新学习并在这些东西上浪费时间,这让我非常恼火。

我有一个在 JNDI 空间中发现并声明的无状态 EJB:

10:01:53,044 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

DTalk/UserManager/local - EJB3.x Default Local Business Interface
DTalk/UserManager/local-com.doctalk.ejb.UserManagerLocal - EJB3.x Local Business Interface

我需要在 servlet 中使用这个 EJB,它是战争的一部分,战争是包含 EJB 的 EAR 的一部分。我想用注射来做。

当我使用最直观的符号时:

@EJB
private UserManager userManager;

我在 JBoss 日志中发现异常。

当我使用更华丽的符号时,例如:

@EJB( mappedName = "UserManager" )
private UserManager userManager;

或者

@EJB( mappedName = "DTalk/UserManager/local" ) // EAR is called DTalk
private UserManager userManager;

我在 jboss 中没有遇到任何注入错误,但注入的 bean 为空。

这令人抓狂,而且是对时间的巨大浪费,让我质疑为什么我不放弃 Eclipse/jboss 工具专营权,转而支持 NetBeans 和 GlsssFish。

感谢任何见解。

谢谢。

【问题讨论】:

  • 您似乎有各种误解需要澄清。您不愿重新学习的“新东西”独立于 JBoss。它们反映了新的 Java 规范。理论上,新版本的 GlassFish 将被更新以支持与 JBoss 相同的新 JSR。没有人强迫你使用新版本的 JBoss,对吧?此外,您不要将 Eclipse/JBoss 配对使用,或将 NetBeans/GlassFish 配对使用。应用服务器可与任何主要 IDE 完全互操作。
  • 嗨,马特,感谢您的来信。既然我做了无用的咆哮,我应该得到一个无用的回应。但是,您关于应用服务器与主要 IDE 互操作的评论有点理想化。如果您喜欢这种类型的东西,或者说将耳朵钉在墙上,它们可能可以互操作。话虽这么说,你有我的答案,还是只有咆哮?
  • 使用最小的@EJB private UserManager userManager; 注入时会出现什么异常?
  • 嗨,Matt,当我应该引用本地接口时,我在 servlet 中使用了 bean 类。再次感谢您的回复。

标签: dependency-injection ejb-3.0 jboss6.x


【解决方案1】:

您正在尝试注入(代理)bean 实例本身,而不是其接口。

然而,根据您显示的部署日志,您仅通过其(本地)接口将 bean 声明为在 JNDI 中绑定。为了使注入发生,您应该将要注入的变量声明为接口:

@EJB
private UserManagerLocal userManager;

或者声明应该为您的 bean 创建一个 no-interface 视图:

@Stateless
@LocalBean
public class UserManager implements UserManagerLocal {
    ...
}

之后,您可以像之前一样声明变量:

@EJB
private UserManager userManager;

【讨论】:

  • Arjan,感谢您提供非常准确和直接的答案。您找到了根本原因:我指的是 bean 类而不是接口。也感谢您让我了解 EJB3.1 无接口视图。我也会检查一下。
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多