gpt4 book ai didi

java - 从基类引用调用时,扩展类中的 CDI 拦截器不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:17 26 4
gpt4 key购买 nike

我对 CDI 拦截器有疑问。在我的 EJB 模块中,我创建了拦截器注释及其实现,我还将实现类添加到 beans.xml。我有一个名为 AbstractFacade 的抽象类和一些从它派生的类。在一个类中,我覆盖了 create 方法并向其添加了我的拦截器注释。现在在 web 模块中,我有带有拦截器注释的 ejb bean 实例,但对它的引用具有 AbstractFacade 类型。当我在此引用上调用创建方法时,会调用 ejb 模块中的适当方法(此方法带有注释)但不会调用我的拦截器,但如果我将此引用转换为它的真实类型并调用创建拦截器将正常工作。我不确定我是否描述得很好,所以这里是代码:

FooInter.java

package foo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface FooInter{}

FooInterImpl.java

package foo;

import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;

@Interceptor
@FooInter
public class FooInterImpl {
@AroundInvoke
public Object fuckCall(InvocationContext context) throws Exception {
System.out.println("Interceptor: it works");

return context.proceed();
}
}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<interceptors>
<class>foo.FooInterImpl</class>
</interceptors>
</beans>

抽象门面.java

public abstract class AbstractFacade<T> {

//...

public void create(T entity) {
//...
}
}

FooFacade.java

@Stateless
public class FooFacade extends AbstractFacade<Foo> {

//...

@Override
@FooInter
public void create(Foo entity) {
super.create(entity);
}
}

好吧,这是在 war 中:

EditHelper.java

public abstract class EditHelper<T> {
protected T entity;

//...

protected abstract AbstractFacade<T> getFacade();

public void save() {
//...
//if T is foo and getFacade returns FooFacade, interceptor won't be called here!
getFacade().create(entity);
}
}

FooEditHelper.java

public class FooEditHelper extends EditHelper<Foo> {
@EJB
private FooFacade fooFacade;

//...

protected AbstractFacade<T> getFacade() {
return fooFacade;
}

@Override
public void save() {
getFacade().create(entity); //interceptor won't works !!!!!!!!!!!
((FooFacade)getFacade()).create(entity); //but here interceptor will work
}
}

我不知道为什么 getFacade().create(entity);不会发射拦截器。如果有任何帮助,我将非常高兴。

最佳答案

我的回答可能有点离题,但我正在从 JSF 托管 bean 迁移到 CDI 托管 bean,我刚刚确认我可以使用 super在“扩展”祖先 CDI bean(使用@Default 限定符)的后代 CDI bean(使用“自定义”@Descendant 限定符)中成功。

带有@Default 限定符的 CDI bean 祖先:

@Default
@Named("pf_pointOfContactController")
@SessionScoped
public class pf_PointOfContactController implements Serializable {

祖先 bean 具有以下内容:

@PostConstruct
protected void init() {

带有@Descendant 限定符的 CDI bean 后代:

@Descendant
@Named("pf_orderCustomerPointOfContactController")
@SessionScoped
public class pf_OrderCustomerPointOfContactController extends pf_PointOfContactController {

后代 bean 具有以下内容:

@PostConstruct
public void init(){
super.init();

我必须添加/使用 super.init(),因为祖先 CDI bean 中的方法会引发 NullPointerException,因为祖先 bean 的 @PostConstruct 不会在 CDI @Descendant bean 中执行。

我看到/听说/读到在使用 CDI 时建议使用 @PostConstruct 而不是 Constructor 方法,因此祖先 bean 的构造函数具有“初始化”逻辑,并且在使用 JSF 时自动调用/执行祖先 bean 的构造函数托管 bean。

关于java - 从基类引用调用时,扩展类中的 CDI 拦截器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com