【问题标题】:Does @EJB work only for interfaces?@EJB 是否仅适用于接口?
【发布时间】:2015-05-22 18:43:50
【问题描述】:

我是 EJB 新手,目前正在编写一些简单的 EJB (EJB 3.0)。

这就是我正在尝试的 -->

远程客户端 -> 调用 EJB(远程)(并且此 EJB 调用本地 EJB)。

EJB 1:

界面

package com.vipin.server.local.bean;

import javax.ejb.Local;

@Local
public interface UtilLocalBeanLocal {

    public String addString();
}

实现此接口的类:

package com.vipin.server.local.bean;

import javax.ejb.Local;
import javax.ejb.Stateless;

@Stateless(mappedName="UtilLocalBeanMappedName")
@Local(value=UtilLocalBeanLocal.class)
public class UtilLocalBean implements UtilLocalBeanLocal {

    public UtilLocalBean() {

    }

    @Override
    public String addString() {

        return "Added from Local bean"; 
    }
}

所以,我正在创建的这个 EJB 被另一个 EJB “本地”使用。

EJB 2:

界面

package com.vipin.bean.session;

import javax.ejb.Remote;

@Remote
public interface FirstBeanRemote {

    public String callMe();
}

实现此接口的类。

package com.vipin.bean.session;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.vipin.server.local.bean.UtilLocalBeanLocal;

@Stateless(mappedName="FirstBeanMappedName")
@Remote(value=FirstBeanRemote.class)
public class FirstBean implements FirstBeanRemote {

    @EJB(name="UtilLocalBeanMappedName")
    private UtilLocalBeanLocal utilLocalBeanLocal;

    /*@EJB(name="UtilLocalBeanMappedName")
    private UtilLocalBean utilLocalBean;*/

    public FirstBean() {

    }

    @Override
    public String callMe() {

        return "Hi there!" + utilLocalBeanLocal.addString();
    }
}

我创建了一个远程客户端,它将调用 EJB -> FirstBean,这个 EJB 将在内部调用 UtilLocalBean(注入 @EJB 注释),如下代码 sn-p:

@EJB(name="UtilLocalBeanMappedName")
private UtilLocalBeanLocal utilLocalBeanLocal; 

在这里,我使用了注入 EJB 实例的“接口”。而且效果很好。

当我这样使用时问题就开始了:

@EJB(name="UtilLocalBeanMappedName")
private UtilLocalBean utilLocalBean;

--> 我使用的是类名本身,而不是接口。

在这种情况下,当我启动 JBOSS AS (7.1.1 final) 时,它会抛出异常:

00:07:33,104 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC00001: Failed to start service jboss.deployment.subunit."EJB30TestProjEAR.ear"."EJB30TestProj.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."EJB30TestProjEAR.ear"."EJB30TestProj.jar".INSTALL: Failed to process phase INSTALL of subdeployment "EJB30TestProj.jar" of deployment "EJB30TestProjEAR.ear"

...

Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS014544: No EJB found with interface of type 'com.vipin.server.local.bean.UtilLocalBean' for binding UtilLocalBeanMappedName

...

00:07:33,421 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"EJB30TestProjEAR.ear\".\"EJB30TestProj.jar\".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"EJB30TestProjEAR.ear\".\"EJB30TestProj.jar\".INSTALL: Failed to process phase INSTALL of subdeployment \"EJB30TestProj.jar\" of deployment \"EJB30TestProjEAR.ear\""},"JBAS014771: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean.ValidatorFactoryjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBeanMissing[jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean.ValidatorFactoryjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean]","jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean.Validatorjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBeanMissing[jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean.Validatorjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.FirstBean]","jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean.Validatorjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBeanMissing[jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean.Validatorjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean]","jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean.ValidatorFactoryjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBeanMissing[jboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean.ValidatorFactoryjboss.naming.context.java.comp.EJB30TestProjEAR.EJB30TestProj.UtilLocalBean]"]}}}

@EJB 仅应用于接口时是否有效?任何意见都非常感谢。

【问题讨论】:

    标签: java ejb jboss7.x ejb-3.0


    【解决方案1】:

    是的,@EJB 只能与业务接口(或超级接口)一起使用。在 EJB 3.1 中,如果声明无接口视图,则可以将 @EJB 与 EJB 类一起使用(如果 EJB 没有其他接口,则为默认值,或者可以使用 @LocalBean 显式指定)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多