2015-05-22 5 views
0

Я новичок в EJB, и сейчас я пишу несколько простых EJB (EJB 3.0).Работает ли @EJB только для интерфейсов?

Это то, что я пытаюсь ->

Remote Client -> Вызовы 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 аннотацию), как показано ниже фрагменте кода:

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

В этом я используя «интерфейс», к которому инжектируется экземпляр EJB. И он отлично работает.

Проблема начинается, когда я использую как это:

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

-> Я использую сам имя класса, а не интерфейса.

В этом случае, когда я начала JBOSS AS (7.1.1 окончательный), он выбрасывает исключение:

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, когда он применяется только к интерфейсу? Любые материалы высоко оценены.

ответ

1

Да, @EJB может использоваться только с бизнес-интерфейсом (или суперинтерфейсом). В EJB 3.1 вы можете использовать @EJB с классом EJB, если вы объявляете представление без интерфейса (это по умолчанию, если EJB не имеет других интерфейсов, или он может быть явно указан с помощью @LocalBean).

Смежные вопросы