在上下文中从客户端向ejb bean注入参数

时间:2015-06-12 16:53:02

标签: java ejb-3.0

如何在Ejb的客户端注入参数? 这样的事情:

final Hashtable<String, String> jndiProperties = new Hashtable<String, String>();
jndiProperties.put("java.naming.factory.initial", "org.ow2.carol.jndi.spi.MultiOrbInitialContextFactory");
jndiProperties.put("java.naming.factory.url.pkgs", "org.ow2.jonas.naming");
jndiProperties.put("java.naming.provider.url", "rmi://localhost:1099");

final Context context = new InitialContext(jndiProperties);
Object obj = context.lookup("MyEjbTest");

context.addToEnvironment("user", new Object());

在服务器端,使用Interceptor获取客户端注入的参数:

public Object intercept(InvocationContext ctx) throws Exception {

    Object o = ctx.getContextData().get("user");
    if (o != null) {
        LOG.info("Exists " + o.toString());
        return ctx.proceed();
    } else {
        return null;
    }
}

参数user永远不会在上下文中注入,而在服务器端o始终为null。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

不,没有标准方法可以从客户端隐式地将数据传递给EJB。您必须通过方法参数显式地将数据传递给EJB。

如果您正在使用RMI-IIOP,那么您可以编写自己的interceptor来将上下文数据传输到服务器,然后将其存储在本地线程中。如果您正在使用WebSphere Application Server,则可以使用application context work areas(这是JSR 149尝试标准化的,但它被认为不够便携)。这些选项可能太小或太麻烦,所以你最好只通过方法参数显式传递数据。

使用RMI-IIOP发送附加上下文数据的完整示例非常广泛,但一般步骤如下:

  1. 首先注册ORBInitializer。请参阅其中的javadoc,但由于ORB配置通常由应用程序服务器严格控制,因此您应该阅读应用程序服务器文档,特别是如何(或者如果它甚至可以支持)您可以添加ORB拦截器以及如何班级装载工作。
  2. 在客户端中,您的ORBInitializer应调用ORBInitInfo.add_client_request_interceptor。在send_request方法的实现中,请调用ClientRequestInfo.add_request_service_context
    1. 通常情况下,您会为OMG保留供应商前缀作为服务上下文ID,但如果您的环境是本地的(即您没有向第三方提供您的应用程序),那么您可以选择一个与您环境中的任何其他产品不冲突的产品。
    2. 您发送的字节是您选择的。您的客户端可能会在本地线程中设置一些数据,然后您的send_request方法实现会将数据序列化为driver.get('http://sberbank.ru/ru/person/credits/money/consumer_unsecured') driver.find_element_by_xpath('//*[@id="s2id_autogen1"]/a').click() driver.find_element_by_xpath('//ul[@class="select2-results ps-container"]/li[2]').click() 以添加到ServiceContext
  3. 在服务器中,您的ORBInitializer应调用add_server_request_interceptor。您对此拦截器的实现将解码客户端发送的服务上下文,并可能在请求期间设置线程局部变量,并在结束时将其删除。