InvocationContext是否传播到嵌套方法

时间:2014-05-05 11:49:33

标签: java ejb

我需要从父节点发送到嵌套方法prarmeter

我定义了一个EJB拦截器并在业务方法级别使用它 我需要在嵌套方法中知道应该从父调用方法(非业务数据)发送的一些信息,这些信息将在aduit中使用 所以,我的问题是,InvocationContext是否传播到嵌套方法

2 个答案:

答案 0 :(得分:0)

可以跨拦截器共享数据:

将相同的InvocationContext实例作为输入参数传递给特定目标方法的拦截器链中的每个拦截器方法。 InvocationContext实例的contextData属性用于跨拦截器方法传递数据。 contextData属性是java.util.Map对象。存储在contextData中的数据可以通过拦截器链下方的拦截​​器方法访问。

存储在contextData中的数据在单独的目标类方法调用中是不可共享的。也就是说,为目标类中方法的每次调用创建一个不同的InvocationContext对象。

但我的问题是InvocationContext是否传播到嵌套方法?

答案 1 :(得分:0)

我有类似的问题。据我所知,上下文不会传播到嵌套方法,至少它不适合我。如果您有一个活动事务(当使用EJB时​​,您可能有一个),您可能会尝试使用TransactionScoped bean。如果没有事务,您可能会尝试定义自定义bean范围(在CDI中),但我没有尝试这个。查看TransactionScoped bean的可能实现。

@SetAuditData
public void someMethod(String user, String foo...) throws Exception {

}

和拦截器(为简单起见,假设参数是第一个参数,即String)

@SetAuditData
@Interceptor
public class AuditInterceptor {

    @Inject
    AuditTransactionalBean auditData;

    @AroundInvoke
    public Object setAuditData(InvocationContext ctx) throws Exception {
        Object[] parameters = ctx.getParameters();
        String user = (String) parameters[0];
        auditData.setData(user);
        return ctx.proceed();
    }
}

一个保存数据的bean(必须是Serializable可以进行钝化处理)

@TransactionScoped
public class AuditTransactionalBean implements Serializable {

    String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data=data;
    }
}

然后可以在嵌套的bean /方法中注入此bean。