【问题标题】:Why @PostConstruct doesn't work?为什么@PostConstruct 不起作用?
【发布时间】:2014-01-20 18:49:27
【问题描述】:

我有一个简单的 EJB,当我通过我的独立客户端运行它时,一切都运行良好, 但是一旦我添加了一个拦截器,EJB 中的 @PostConstruct 就会停止工作:

包拦截器;

public class LogInterceptor {

@PostConstruct
public void init(InvocationContext context) {
    System.out.println(new Date().toString() +" Entered interceptor");
}

@PreDestroy
public void aboutToBeRemoved(InvocationContext context) {
    System.out.println(new Date().toString() + " Leaving interceptor");
}

@AroundInvoke
public Object gettingToBusiness(InvocationContext context) {

    String methodName = context.getMethod().getName();
    System.out.println("The method name is: " +methodName);

    if (methodName.equals("add")) {

    }
    try {
        return context.proceed();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}


}

我的测试客户:

public class Test {

public static void main(String[] args){
    InitialContext ctx=getInitialContext();
    ListRemote stub=null;
    try {
        stub = (ListRemote)ctx.lookup("ejb:/Lab12/ListEJB!interceptor.ListRemote?stateful");
    } catch (NamingException e) {
        System.out.println("Lookup Failed");
        e.printStackTrace();
    }
    System.out.println("Adding data");
    stub.add("Hello");
    stub.add("-");
    stub.add("World");
    stub.add("!!!");
    System.out.println("Getting data :");
    for(Object o:stub.getAll()){
        System.out.print(o+" ");
    }
    System.out.println("Removing '-' element");
    stub.remove(1);
    System.out.println("Getting data again:");
    for(Object o:stub.getAll()){
        System.out.print(o+" ");
    }
    stub.destroy();
}

public static InitialContext getInitialContext(){
    Properties properties = new Properties();
    properties.put(Context.URL_PKG_PREFIXES , "org.jboss.ejb.client.naming");
            try {
        return new InitialContext(properties);
    } catch (NamingException e) {
        System.out.println("Cannot generate InitialContext");
        e.printStackTrace();
    }
    return null;
}
}

我的 EJB:

@Stateful(name="ListEJB")
@Interceptors({LogInterceptor.class})
public class ListBean implements ListRemote{
private ArrayList<Serializable> list;

@PostConstruct
public void init(){
    System.out.println("In it init ---------------------------------------------------");
    list=new ArrayList<Serializable>();
}
public void add(Serializable object){
    System.out.println("Currently in the list is: " +list);

    System.out.println("The object is: " +object);
    list.add(object);
    System.out.println("Added");
}
public Serializable get(int index){
    return list.get(index);
}
public void remove(int index){
    list.remove(index);
}
public Object[] getAll(){
    return list.toArray();
}
@Remove
public void destroy(){
    list=null;
}

}

为什么它会禁用我的 EJB @PostConstruct ?

【问题讨论】:

  • 你的意思是它不工作?它没有被调用?
  • 是的,它没有被调用
  • 谁来处理@PostConstruct?你没有容器
  • @Eugene 根据代码,好像在JBoss容器中

标签: java jakarta-ee ejb


【解决方案1】:

在这段代码中:

@PostConstruct
public void init(InvocationContext context) {
    System.out.println(new Date().toString() +" Entered interceptor");
}

您正在拦截原始 EJB 的 PostConstruct 并且不让它通过。如果要将其传递给目标 EJB,则需要调用继续:

@PostConstruct
public void init(InvocationContext context) {
    System.out.println(new Date().toString() +" Entered interceptor");
    context.proceed();
}

同样适用于您的 PreDestroy。基本上它适用于所有拦截的方法。请参阅EJB3 specification,第 12.5 节(第 308 页):

拦截器方法必须始终调用 InvocationContext.proceed() 或不调用 后续拦截器方法或 bean 业务方法或生命周期 回调方法将被调用。

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 2011-03-25
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多