2014-01-15 2 views
0

JNDI 조회를 사용하여 별도의 JVM에서 실행되는 클라이언트에서 원격 EJB3 Bean에 액세스하려고합니다. 다음 내 콩 클래스는 다음과 같습니다EJB3 원격 인터페이스를 클라이언트에서 사용 가능하게 만드는 방법은 무엇입니까?

@Path("/payment/") 
@Consumes({ "application/xml", "application/json" }) 
@Produces({ "application/xml", "application/json" }) 
@Local({ PaymentWebServiceLocal.class }) 
@Remote({ PaymentWebServiceRemote.class }) 
@Stateless(mappedName = "ejb/PaymentWebService") 
public class PaymentWebServiceImpl implements PaymentWebServiceLocal,PaymentWebServiceRemote { 

private static final Logger logger = Logger.getLogger(PaymentWebServiceImpl.class); 


@POST 
@Path("/processpayment") 
public PaymentResponse processPayment(PaymentRequest request) { 
    //do something 
} 

빈의 원격 인터페이스는 I는 다음과 같이 원격 클라이언트에서 processPayment() 메소드를 호출하기 위해 JNDI를 사용하여 EJB를 조회, 지금

@Remote 
public interface PaymentWebServiceRemote { 
    public PaymentResponse processPayment(PaymentRequest request); 
} 

을 다음과 같다

클라이언트가 원격 PaymentWebServiceRemote 인터페이스에 대해 모르겠다는 것이 이해가되지 않습니다. EJB Bean 코드가있는 다른 서버에 있습니다. 이 인터페이스의 사본을 클라이언트 코드에도 가져와야합니까? 아니면 클라이언트가 EJB3에서 사용하도록 원격 인터페이스를 사용하여 클라이언트 EJB jar를 만드는 방법이 있습니까 (EJB2에서와 같이)?

도움을 주시면 감사하겠습니다.

답변

1

필요한 모든 인터페이스를 포함하는 클라이언트 jar를 만들고 인터페이스의 메소드로 전달 될 수도있는 매개 변수 클래스 인 을 만들어야합니다. 당신의 예에서

당신은 클라이언트 항아리에

  • VoidRemittanceService
  • VoidRemittanceServiceRemote
  • PaymentResponse

을 넣어해야합니다.

원격 인터페이스의 구현 클래스는 클라이언트 jar 내에서 필요하지 않습니다.

물론 복사본을 만들어 클라이언트 프로젝트에 넣을 수도 있습니다. 하지만이 은 인터페이스를 항상 두 번 변경해야하기 때문에 좋은 습관이 아닙니다. 또한 클라이언트 인터페이스가 서버 jar과 동일한 JRE 버전으로 컴파일되어 있는지 확인해야합니다. 그렇지 않으면 문제가 생길 수 있습니다.

서버 및 클라이언트에서 사용할 공유 코드 수단을 포함하는 추가 프로젝트를 만드는 것이 좋습니다. 이 프로젝트는 서버 프로젝트와 클라이언트 프로젝트에서 참조 할 수 있습니다. 이런 식으로 공유 코드의 변경은 서버와 클라이언트 측에 직접 영향을 미칩니다.

+0

그래서 EJB2가 작동하는 것과 비슷합니다. – user3057702

+1

EJB2.1과 EJB3.x는 모두 RMI/IIOP 프로토콜을 기반으로하므로 비슷합니다. – Diversity

관련 문제