我正在尝试从使用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中所做的那样)?
感谢任何帮助。
答案 0 :(得分:1)
您必须创建一个包含所有必要接口的客户端jar 可以传递给接口方法的参数类。
在您的示例中,您需要输入
进入客户端jar。
客户端jar中不需要远程接口的实现类。
当然,您也可以制作副本并将其放入客户端项目中。但是这个 这是不好的做法,因为你必须经常两次更改界面。 此外,您必须确保使用与服务器jar相同的JRE版本编译客户端接口。否则可能会出现问题。
良好做法是创建一个包含共享代码的附加项目,服务器和客户端将使用该代码。该项目可以由服务器项目和客户端项目引用。这样,共享代码的更改直接影响服务器和客户端。