繁体   English   中英

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

[英]Inject a parameter from client to ejb bean in the context

如何在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());

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

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。 有什么办法处理吗?

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

如果使用的是RMI-IIOP,则可以编写自己的拦截器以将上下文数据传输到服务器,然后将其存储在本地线程中。 如果使用的是WebSphere Application Server,则可以使用应用程序上下文工作区JSR 149尝试将其标准化,但认为它不够便携)。 这些选项可能太小众或太麻烦了,因此最好通过方法参数显式传递数据。

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

  1. 首先注册ORBInitializer 请参阅其中的javadoc,但是由于ORB配置通常由应用程序服务器严格控制,因此您应该阅读应用程序服务器文档,特别是有关如何(或什至根本不支持)添加ORB拦截器以及类加载如何工作的信息。 。
  2. 在客户端中,您的ORBInitializer应调用ORBInitInfo.add_client_request_interceptor 在send_request方法的实现中,调用ClientRequestInfo.add_request_service_context
    1. 通常,您会为服务上下文ID保留一个带有OMG的供应商前缀,但是如果它在您的环境中是本地的(即您没有将应用程序提供给第三方),那么您可以选择一个不冲突的前缀。与您环境中的其他任何产品一起使用。
    2. 您发送的字节是您的选择。 您的客户端可能会在本地线程中设置一些数据,然后您对send_request方法的实现会将数据序列化为一个byte[] ,以添加到ServiceContext中
  3. 在服务器中,您的ORBInitializer应调用add_server_request_interceptor 您对该拦截器的实现将解码客户端发送的服务上下文,并可能在请求期间设置线程局部变量,并在最后将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM