【问题标题】:My web app works only with META-INF instead of WEB-INF including beans.xml. Why?我的网络应用程序仅适用于 META-INF 而不是 WEB-INF,包括 beans.xml。为什么?
【发布时间】:2014-12-29 05:18:07
【问题描述】:

我正在研究 java 中的依赖注入示例,大多数文档都强调我必须在

中放置一个空的 beans.xml
  • META-INF 如果是 jar 应用程序
  • WEB-INF(如果是 Web 应用程序)

所以,我使用战争类型的包装,但是,我的应用程序只有在我将beans.xml 放入 META-INF 文件夹时才能工作。我对为什么它以这种方式工作有点困惑?我在 JBOSS/WildFly 容器中部署我的 war 文件。

这是我的简单pom.xml

beans.xml 位于src/main/resources/META-INF

您还可以在这里看到我仅用于注入 bean 的注释。

AutoService.java

public interface AutoService {
    void getService();
}

BMWAutoService.java

@Named("bmwAutoService")
public class BMWAutoService implements AutoService{

    @Override
    public void getService() {
        System.out.println("You chose BMW auto service");
    }
}

AutoServiceCaller.java

@Named
public class AutoServiceCallerImp implements AutoServiceCaller{

    private AutoService bmwAutoService;

    @Inject
    public AutoServiceCallerImp(@Named("bmwAutoService") AutoService bmwAutoService) {

        this.bmwAutoService = bmwAutoService;
    }

    @Override
    public void callAutoService() {
        // get bmw's auto service
        bmwAutoService.getService();
    }
}

【问题讨论】:

    标签: jakarta-ee cdi wildfly-8 meta-inf


    【解决方案1】:

    这取决于您在哪里使用注释。如果您的 Web 模块中有 EJB bean 并且在这些 bean 中使用注入,那么您将需要在 META-INF 中有 beans.xml ,就像在纯 ejb 模块的情况下一样。如果您在 Web 组件(servlet、过滤器、JSF bean)中使用 CDI 注入,那么您必须将它放在 WEB-INF 中。您可能还需要在这两个地方使用它们(如果从两种组件中使用)。

    【讨论】:

    • 感谢您的回答。我只使用了@Named@Inject 注释来注入bean。那么,这是否意味着我正在使用 EJB bean?我添加了我使用的非常简单的代码示例
    • @quartaela 不,看起来您只使用网络 bean。所以打包之后你的 beans.xml 应该在WEB-INF。尝试将 beans.xml 放入 src\main\webapp\WEB-INF 文件夹,而不是 src/main/resources/META-INF
    • 行得通!你能告诉我src\main\webappsrc\main\resources 之间的区别吗?我试图将WEB-INF 放入资源文件夹中,就像我为META-INF 所做的那样
    • @quartaela 这就是Maven archetype 的工作方式。 resources 文件夹是资源的根文件夹 :) 并且放置在那里的文件被复制到已编译的类文件夹中,因此 WEB-INF/classes 在战争打包的情况下和 beans.xml 它不是正确的位置。另一方面,webapp 是 web 应用程序文件的根目录,如 htmls、jsps、图像等,也用于在 WEB-INF 子文件夹(如 web.xml)和其他配置文件中存储任何描述符打包后放入WEB-INF
    最近更新 更多