这个问题通常会在两种情况下发生
第一种是在标注了@BeforeResult的方法中有异常发生,这个时候struts2会调用这个方法多次,这个问题同事有很多人碰到过,解决办法是在标注了@BeforeResult的方法中捕获所有异常,然后添加到ActionError中。
第二种是出现的情况是在两个有继承关系的Action中都标注有@BeforeResult方法,这个时候struts就好调用子类中的
标注有@BeforeResult的方法两次,这个问题可以从xwork的源代码com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor中发现问题所在。
public void beforeResult(ActionInvocation invocation, String resultCode) { Object action = invocation.getAction(); List if (methods != null && methods.size() > 0) { Collections.sort(methods, new Comparator public int compare(Method method1, Method method2) { return method2.getAnnotation(BeforeResult.class).priority() - method1.getAnnotation(BeforeResult.class).priority(); } }); for (Method m : methods) { try { m.invoke(action, (Object[]) null); } catch (Exception e) { throw new XWorkException(e); } } } } |
实现中首先是找到所有的标注有@BeforeResult的方法,然后在子类的实现上依次调用找到的方法,所以就出现了调用两次的问题。解决办法比较简单就是避免这种结构出现在自己的类中,或者自己写一些代码检查是不是已经执行过@BeforeResult中的方法。
No comments:
Post a Comment