2

我正在为 CDI 和类继承而苦苦挣扎。我有一个 JAX-RS 控制器声明为:

@Path("/share")
public class ControllerShare extends BaseController {
    @Inject
    private ServiceShare serviceShare;

    @PostConstruct
    private void verifInit() throws ExceptionTechnique {
        log.warn("Checking CDI injection");
        if (serviceShare == null) {
            log.error("serviceAccount not initialized. Check your EJB configuration");
            throw new ExceptionTechnique("serviceShare not initialized. Check your EJB configuration.");
        }
    }
...
}

此控制器扩展了声明为的基本控制器:

public abstract class BaseController {
    private Logger log = LoggerFactory.getLogger(ControllerShare.class);

    @Context protected HttpServletRequest request;
    @Inject private ControlerSession ctrlSession;

    public BaseController() {}

    @PostConstruct
    private void verifInit() throws ExceptionTechnique {
        log.warn("Checking CDI injection");
        if (ctrlSession == null) {
            log.error("controllerSession not initialized. Check your CDI configuration");
            throw new ExceptionTechnique("serviceAccount not initialized. Check your CDI configuration.");
        }
    }
...
}

问题是在 ControllerShare 中正确完成了注入(我正确地看到了“检查 CDI 注入”),但在 BaseController 类中没有完成(ctrlSession 为空)。我尝试@Named 和其他组合但没有成功。注入只是在 ControllerShare 中完成,而不是在 BaseController 中完成。

编辑: 还有一件事:奇怪的是@Context 工作正常。我的请求已设置并且值正确。

感谢您的任何解释和解决方案。

4

1 回答 1

1

实际上,这应该根据

http://docs.jboss.org/cdi/spec/1.0/html/inheritance.html

4.2. 成员级元数据的继承

假设类 X 由托管 bean 或会话 bean Y 的 bean 类直接或间接扩展。

  • 如果 X 声明一个注入字段 x,则 Y 继承 x。

附带说明:@PostConstruct但是,如果您重新指定它,则不会继承。因此,在您的子类中,您的方法必须以不同的方式命名才能执行两个初始化程序。

  • 如果 X 声明了一个初始化器、非静态观察者、@PostConstruct 或 @PreDestroy 方法 x(),则 Y 继承 x() 当且仅当 Y 和任何作为 X 的子类和 Y 的超类的中间类都没有覆盖该方法时X()。
于 2013-03-01T09:51:32.450 回答