如何让EJB3远程接口可供客户端使用?

时间:2014-01-15 05:32:25

标签: java client ejb-3.1

我正在尝试从使用JNDI查找在单独的JVM上运行的客户端访问远程EJB3 bean。以下是我的bean类:

@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
}

Bean的远程接口如下

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

现在,我使用JNDI查找EJB以从远程客户端调用processPayment()方法,如下所示

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    env.put(Context.PROVIDER_URL, t3:\\);
    Context ctx = new InitialContext(env);
    return ctx.lookup("ejb.PaymentWebService#test.webservice.payment.service.PaymentWebServiceRemote");

我不明白的是客户端不知道远程PaymentWebServiceRemote接口。它位于另一个带有EJB Bean代码的服务器中。我是否还必须将此接口的副本复制到客户端代码中?或者是否有一些方法可以创建一个带有远程接口的客户端EJB jar,以便客户端在EJB3中使用(就像我们在EJB2中所做的那样)?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您必须创建一个包含所有必要接口的客户端jar 可以传递给接口方法的参数类。

在您的示例中,您需要输入

  • VoidRemittanceService
  • VoidRemittanceServiceRemote
  • PaymentResponse

进入客户端jar。

客户端jar中不需要远程接口的实现类。

当然,您也可以制作副本并将其放入客户端项目中。但是这个 这是不好的做法,因为你必须经常两次更改界面。 此外,您必须确保使用与服务器jar相同的JRE版本编译客户端接口。否则可能会出现问题。

良好做法是创建一个包含共享代码的附加项目,服务器和客户端将使用该代码。该项目可以由服务器项目和客户端项目引用。这样,共享代码的更改直接影响服务器和客户端。