使用 javax.faces.bean.ViewScoped 注解的 bean 时如何失败

Adr*_*ski 5 jsf cdi

有没有办法检测@Named用创建的 CDI-Beans javax.faces.bean.ViewScoped?我多次遇到过这样的情况:IDE 更喜欢这个注释而不是javax.faces.view.ViewScoped.

javax.faces.bean.ViewScoped当找到带注释的 CDI-Bean时,有没有一种好方法可以中止应用程序启动?

Bal*_*usC 4

javax.faces.bean.ViewScoped当找到带注释的 CDI-Bean时,有没有一种好方法可以中止应用程序启动?

是的!只要您拥有bean-discovery-mode="all".

以下是针对您的特定用例量身定制的启动示例:

package com.stackoverflow.q76653269;

import java.util.HashSet;
import java.util.Set;

import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.DeploymentException;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;

public class BadBeansDetector implements Extension {

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> type) {
        Set<Class<?>> badBeans = new HashSet<>();

        if (type.getAnnotatedType().getAnnotation(javax.faces.bean.ViewScoped.class) != null) {
            badBeans.add(type.getAnnotatedType().getJavaClass());
        }
        
        if (!badBeans.isEmpty()) {
            throw new DeploymentException("Bad beans found! " + badBeans);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要让它运行,请创建一个META-INF/services/javax.enterprise.inject.spi.Extension包含唯一内容的文本文件:

com.stackoverflow.q76653269.BadBeansDetector
Run Code Online (Sandbox Code Playgroud)

对于 Maven WAR 项目,此META-INF文件夹必须驻留在src/main/resources(因此不是src/main/webapp)。

如果你已经这样做了bean-discovery-mode="annotated",那么这将不起作用,但是坏bean首先是不可注入的,并且已经在任何地方阻止部署并出现不满足的依赖异常@Inject,你不需要问这个问题。

当然,另一种选择是升级到 JSF 2.3,其中标记了此注释@Deprecated,并重新配置您的构建/编译器,使其在遇到已弃用的事物时失败。另一种选择是进一步迁移到 Faces 4.0,其中这个已弃用的注释已被长期删除;)