2013-11-15 2 views
0

글래스 피쉬 4를 사용하고 있습니다. 그리고 WAR와 JAR (EJB 포함)이있는 EAR을 가지고 있습니다.동일한 EAR 내의 WAR에서 EJB 호출하기

내 WAR에서 EJB를 호출하고 싶지만 로컬 또는 원격 인터페이스를 사용해야하는지 잘 모르겠습니다.

@Stateless 
public class Test implements TestLocal { 

    @Override 
    public void testing() { 
    } 
} 

그리고 내 로컬 : 내 WAR 내부

@Local 
public interface TestLocal { 
    void testing(); 
} 

내가 웹 서비스를하고 내 JAR 내부

, 내 콩은 다음과 같습니다 다음과 같습니다 :

@WebService(serviceName = "TestWS") 
public class TestWS { 

    private @EJB TestLocal testBean; 

    @WebMethod(operationName = "test") 
    public String test() { 
    testBean.test(); 
    } 
} 

두 가지 모두는 EAR에 패키지되어 있습니다. 첫째

Warnung: javax.ejb.AccessLocalException: Client not authorized for this invocation at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)

:

  • 이는 EJB를 호출하는 올바른 방법인가

    내 WebService에 메서드를 호출

    가 나는 AccessLocalException를 얻을. EAR 내부의 WAR는 포함 된 JAR의 로컬 인터페이스를 사용할 수 있습니까?
  • 그렇다면 누군가 내가 뭘 잘못하고 있는지 알아? 어떤 종류의 보안 구성을 설정해야합니까?
+0

EJB에 대한 보안 구성 설정이 있습니까? – JamesB

답변

0

원격 EJB를 조회하려면 원격 인터페이스가 노출되어 있어야합니다. 당신의 전쟁에 원격 인터페이스를 포함 시키십시오. ,

역할 매핑 정보 (예를 들어, 태양의 ejb-jar.xml의) 일 특정 XML에서 사용할 수

javax.ejb.AccessLocalException: Client Not Authorized Error 

설명 :

글래스 피시 문서는이 오류에 대한 항목이 있습니다 인증은 괜찮지 만, 다음과 같은 오류 메시지가 표시됩니다

[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...| 
javax.ejb.AccessLocalException: Client not authorized for this invocation. 
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:... 
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...) 

솔루션

EJB 모듈 (.jar) 또는 웹 모듈 (.war)이 응용 프로그램 (.ear)에 패키지되어 있고 응용 프로그램 수준의 Sun-specific, sun-application.xml에 역할 매핑 정보가 없는지 확인하십시오. 모든 응용 프로그램 (.ear)의 경우 보안 역할 매핑 정보를 sun-application.xml에 지정해야합니다. 모듈 수준의 XML과 응용 프로그램 수준의 XML을 모두 사용할 수 있습니다.

0

@Remote는 EJB를 포함하는 jar 파일을 다른 서버에 배포 할 때 유용합니다.

전쟁과 항아리가 같은 귀에 있으므로 로컬 주석을 사용해야합니다.

팁 : EJB 3.1 인터페이스가 필요하지 않으므로 "Test"클래스에서 직접 @LocalBean을 사용하고 TestLocal 인터페이스를 제거 할 수 있습니다.

당신의 전쟁 인 클래스에 ejb 메서드를 호출하려면 먼저 war와 jar 사이의 링크를 만들어야합니다. 같은 귀에 사는 것만으로는 충분하지 않습니다. Maven을 사용하는 경우, jar 참조를 전쟁의 pom에있는 종속성에 추가하기 만하면됩니다.

+0

전적으로 정확하다고 생각하지 않습니다. EJB jar가 EAR의 모듈이면 모든 클래스를 WAR에서 사용할 수 있습니다. POM (' compile')에 대한 참조를 추가하면 EJB jar가 이미 WAR의/WEB-INF/lib 폴더에 추가됩니다. EJB Jar가 이미 EAR의 모듈 인 경우에는 필요하지 않습니다. – rubenlop

관련 문제