1

我有一个 RESTful 服务,它使用 @EJB 注释注入 EJB(3.0)。此注入不起作用,因为当我尝试访问 bean 上的 greeting() 方法时收到 NullPointerException。

这个确切的代码适用于 Glassfish 3.1,现在在 WAS8.0.2 上它失败了。然而,当使用完全相同的方法从 servlet 引用时,注入在同一个应用程序中起作用

@Stateless
@Path("/hello")
public class HelloRestService {

@EJB
public HelloInterface helloImpl;

}

我的 Bean 看起来像这样

package impl;

@Stateless
@Local
public class HelloImpl implements iface.HelloInterface {

@Override
public String greeting() {

    return "Hello developer";
}

}

我尝试使用在服务器启动期间打印出来的 jndi 名称来查找实现

helloimpl = (HelloImpl) new InitialContext().lookup("java:global/REST_EAR/REST_WAR/HelloImpl!iface.HelloInterface");

然而,这会导致 ClassCastException

java.lang.ClassCastException: iface.EJSLocal0SLHelloImpl_f8ca883b incompatible with impl.HelloImpl

我可以阅读很多内容吗..?

现在我正在使用 Wink 作为我的 JAX-RS 1.1 实现。我以前使用过泽西岛,结果相同。

有谁知道这是否是导致 DI 失败的 JAX-RS / WAS 问题..?如前所述,它肯定与 REST 有关,@EJB 注入从 Servlet 工作

4

4 回答 4

1

关于转换问题:您应该转换为iface.HelloInterface而不是转换,HelloImpl因为您的 bean 是用代理包装的。

我不知道为什么@EJB不起作用,但我很确定 Wink 与 EJB 注释无关......

于 2012-03-01T15:49:17.427 回答
0

我设法解决了这个问题,但是除了 WAS 8 中的默认实现之外,我无法使用任何其他 JAX-RS 实现。我不得不从每个 RESTful 资源和我的 web.xml 扩展 javax.ws.rs.core.Application。 xml 我将我的 servlet 注册为

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

我还必须在 Web 项目的 WEB-INF 文件夹中拥有 ibm-web-bnd.xml 和 ibm-web.ext.xml。我那里也有一个空的 beans.xml 文件,这是 CDI 所必需的,但我不记得这是否必不可少。

我希望这可以帮助人们解决这个问题,因为我在网上看到很多无法解决这个问题。

于 2012-03-15T05:40:22.013 回答
0

我在应用程序中注入 EJB (NPExc.) 时遇到了类似的问题。部署在 WAS 8 (z/OS) 上。我没有使用接口视图(同一 EAR 中的本地 EJB)。在本地 WAS8 上一切正常。解决方案只是从 WEB 模块类路径(在清单文件中)中删除 EJBclient.jar。

于 2012-12-17T09:16:21.053 回答
0

您可以通过上下文使用旧的注入方式,如果您在 IBM websphere 8 上运行,它适用于我,因为这是在 websphere 9 中修复的

if (adapterBusinessFacadeRemote == null) {
        try {
            Context initialContext = new InitialContext();
            adapterBusinessFacadeRemote = (IAdapterBusinessFacadeRemote) initialContext
                    .lookup("ejb/adapterBusinessFacadeRemote ");
        } catch (NamingException ex) {
            LOGGER.logError("process", "Cannot get connection: " + ex);
        }
    }
于 2021-03-09T14:38:09.053 回答