pho*_*360 6 logging jboss java-ee interceptor
我正在使用JBoss 7.1构建Java EE应用程序.
为了对用户操作进行全面审核,我计划使用Interceptor来记录我的bean方法的每次调用.
为此,我有以下招标:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Logged {
}
Run Code Online (Sandbox Code Playgroud)
然后我定义我的拦截器类:
@Logged
@Interceptor
public class UserActionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class);
public UserActionInterceptor() {
}
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception {
log.debug(invocationContext.getMethod().getName() + " invoked.");
return invocationContext.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常.如果我使用这个拦截器绑定一个类,我会得到一些日志记录.但是,当我想要定位我的bean类时,它变得更加棘手.
如果我有一个@RequestScoped类型的bean并将其绑定到我的拦截器,它就可以工作.但是,如果我有一个@ViewScoped类型的bean,那么它不会.
我查了@ViewScoped的定义,发现:
@Retention(value=RUNTIME)
@Target(value=TYPE)
@Inherited
public @interface ViewScoped
Run Code Online (Sandbox Code Playgroud)
我觉得问题在于这个注释没有目标类型METHOD,它阻止我的拦截器拦截对类方法的调用.
以前有人有同样的问题吗?有人知道是否可以扩展bean的范围,以便可以截获其方法而不改变@ViewScoped的性质?
发生这种情况是因为拦截器无法访问@ManagedBean。@ViewScope 不是 CDI 的一部分,它随 JSF beans 一起提供。
为了使其工作,最可靠的方法是通过使用提供它的扩展之一将 @ViewScoped 与 CDI 结合使用。您的选项包括 MyFaces CODI 和 Seam 3(例如)。
通过安装MyFaces CODI并在这些导入中使用以下注释,我已经让它工作了(与您描述的方式相同) :
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
@Interceptors({ MyInterceptor.class})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |