2015-06-12 45 views
0

如何在Ejb的客户端注入参数? 类似的东西:在上下文中将客户端参数注入ejb bean

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

参数用户从来没有在上下文中以及在服务器侧O注入始终为空。有什么办法来处理?

回答

0

不,没有标准的方法来隐式地将数据从客户端传递到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. 通常情况下,您将为服务上下文ID预留一个带有OMG的供应商前缀,但是如果它对您的环境是本地的(即,您没有向第三方提供应用程序),那么您可以选择一个这与您的环境中的任何其他产品不会发生冲突。
    2. 您发送的字节是您选择的。您的客户端可能会在本地线程中设置一些数据,然后您实施send_request方法将数据序列化为byte[]以添加到ServiceContext
  3. 在服务器中,您的ORBInitializer应该调用add_server_request_interceptor。你的这个拦截器的实现将解码客户端发送的服务上下文,并可能在请求期间设置一个线程局部变量,并在最后删除它。
+0

目标是避免为方法添加参数,请给我一个在RIM-IIOP的情况下使用拦截器传输上下文数据的例子吗? – Thumbuscker

+0

一个完整的例子会非常广泛,所以我已经用粗略的轮廓更新了答案。如果在尝试过之后对特定步骤有疑问,我会鼓励您打开一个更具体的问题。 (或者你可以忽略这个答案,并等待其他人提供一个完整的例子,如果你喜欢。)所有这些说,我真的不认为这种方法是值得的努力;我强烈建议你只添加一个额外的方法参数。 –