将weld-se 与 Gradle 应用程序插件一起使用时出现 Bean 发现问题

2024-01-01

我正在构建一个基于 Gradle 的 Java SE 应用程序,该应用程序构建在 Hibernate 之上,作为我选择的 ORM。我的计划是使用weld-se能够使用 CDI 注释进行注入EntityManagers整个申请过程中。

基于共同的HibernateUtil在 Hibernate 文档中找到帮助程序类,我转向 JPA 接口并添加@Produces提供生产者方法的注释(我添加了一个空的META-INF/beans.xml以及):

package dao;

import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class HibernateUtil {
    private static final EntityManagerFactory emf = buildEntityManagerFactory();

    private static EntityManagerFactory buildEntityManagerFactory() {
        try {
            return Persistence.createEntityManagerFactory("persistenceUnit");
        } catch (Throwable ex) {
            System.err.println("Initial EntityManagerFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    @Produces
    public static EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public static void closeEntityManager(@Disposes EntityManager em) {
        System.out.println("Closing EM");
        try {
            em.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

当我尝试使用@Inject但是,Weld 无法解析字段上的正确生成器方法并生成异常:

线程“main”中的异常 org.jboss.weld.exceptions.UnsatisfiedResolutionException:WELD-001308: 无法解析类型为 class app.DemoApplication 的任何 bean; 限定符:[@javax.enterprise.inject.Any()] 在 org.jboss.weld.bean.builtin.InstanceImpl.get(InstanceImpl.java:101) 在 app.Main.main(Main.java:14)

有问题的代码通过 Weld 容器实例化以支持 CDI,并且非常基本:

package app;

import javax.inject.Inject;
import javax.persistence.EntityManager;

public class DemoApplication {
    @Inject private EntityManager em;

    public void run() {
        try {
            em.getTransaction().begin();
            System.out.println("Inside transaction");
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            em.getTransaction().rollback();
            em.close();
        }
    }
}

我在这里错过了一个明显的观点吗?如何让 Weld 发现用于注入依赖项的生产者方法?

我已经整理了一个最小的项目来重现我的问题Github https://github.com/AdrianoKF/weld-se-stackoverflow。感谢您提供任何有用的建议! :)

2015年5月18日更新:

看来我误解了错误消息。事实上,Weld 甚至没有解决DemoApplicationbean,这让我相信,bean 发现过程出了问题。将我的weld-se依赖项更新到新发布的3.0.0.Alpha8版本(请参阅链接的Github存储库)后,我能够通过手动告诉Weld有关我的bean的信息来使应用程序工作Main.java:

final Weld weld = new Weld()
        .enableDiscovery()
        .addPackage(false, HibernateUtil.class)
        .addPackage(false, DemoApplication.class);

尽管如此,关于为什么尽管有一个空的bean却没有自动发现bean的任何建议META-INF/beans.xml到位受到高度赞赏!

2015年5月19日更新:

谜底已解开,请看下面我自己的回答。我更改了问题标题,以反映问题的实际性质。


在这样的问题上花费了比看起来理智更多的时间,我终于能够找到问题的根源。它与 Weld 和 Jandex 无关,而与 Gradle 构建其输出目录的方式有关:

The :build任务为实际编译结果和附加资源创建两个单独的输出文件夹(build/classes and build/resources)。仅当您创建 JAR 存档时,这两个文件夹才会合并。这:run然而,task 直接从编译输出文件夹启动应用程序,其中包含两个单独的类路径条目和资源。

Weld 的 bean 发现机制显然只尝试发现与META-INF/beans.xml文件,在本例中是build/resources/main文件夹。反过来,没有发现任何豆子,也没有资格在任何地方注入。

我现在的解决方法(请参阅 Git 存储库)是创建一个额外的 Gradle 任务以将资源复制到适当的文件夹中,以便在正确的类路径条目上进行 Bean 发现:

task copyResources(type: Copy) {
    from "${projectDir}/src/main/resources"
    into "${buildDir}/classes/main"
}

processResources.dependsOn copyResources

Gradle 论坛中描述了类似的相同问题:https://discuss.gradle.org/t/application-plugin-run-task-should-first-consolidate-classes-and-resources-folder-or-depend-on-installapp-or-stuff-like-weld-无法工作/1248 https://discuss.gradle.org/t/application-plugin-run-task-should-first-consolidate-classes-and-resources-folder-or-depend-on-installapp-or-stuff-like-weld-se-wont-work/1248

感谢大家的提示!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将weld-se 与 Gradle 应用程序插件一起使用时出现 Bean 发现问题 的相关文章

随机推荐

  • ASP.NET Core 中的声明问题(更新数据库后用户仍然有一些声明)

    我正在学习 asp net core 但我陷入了困境 我会尝试以某种方式解释 问题在于用户索赔 当我登录网站时 用户可以创建和删除声明并且所有工作都可以进行 但是 当该用户更改他无法删除某些内容时 更新数据库后他仍然可以 在数据库中删除消失
  • 禁用sequelize.js中的updatedAt(更新日期)字段

    I used sequelize auto生成模式 我尝试使用findOne 我得到了这个错误 未处理的拒绝 SequelizeDatabaseError 列名无效 更新时间 在我的数据库表中 没有字段updatedAt 例如我的表名是Us
  • 直接从模型实例化查询构建器

    当我做类似的事情时SomeModel with user 它返回一个Query Builder实例 我怎样才能获得这个实例而不需要调用with 或类似的 例如 我尝试过 new SomeModel 但它显然会返回我的模型的实例 而不是查询生
  • GNU Makefiles 中是否有类似 python 装饰器的机制?

    我发现自己在 Makefile 中声明 GNU make 目标是假的两种可能性之间有点左右为难 一是一次性宣布所有假货 PHONY targ1 targ2 targ3 targ1 targ2 targ3 其优点是 对我来说 更具可读性并且更
  • 使用 OR 运算符的复合查询 flutter 和 firebase [重复]

    这个问题在这里已经有答案了 我正在创建一个 flutter 应用程序 它应该查询 Firestore 集合并在满足两个条件时返回结果 这是我的代码 Stream
  • Flutter ImageIcon 显示图像白色或黑色

    所以我一直在尝试使用我存储在资产中的图片并将其用作徽标 这样我就可以将徽标制作成动画 而不仅仅是将其作为静态图片 但徽标始终只显示白色 或者当我尝试将其包裹并将颜色设置为空时 它会显示全黑色 所以想知道如何让它显示我的原始图像 new Ic
  • 如何通过套接字共享 Perl 数据结构?

    在套接字中我编写了客户端服务器程序 首先 我尝试在其中发送普通字符串 它发送得很好 之后 我尝试将哈希值和数组值从客户端发送到服务器 再将服务器发送到客户端 当我使用 Dumper 打印这些值时 它只提供参考值 我应该怎么做才能获取客户端服
  • Android 以编程方式在消息应用程序中插入具有不正确时间戳的短信

    我尝试使用未记录的内容提供程序 content sms 将短信插入收件箱 并且插入成功 然后我在消息应用程序中检查新插入的消息 但是显示的时间始终是插入完成的实时时间 而不是我在 ContentValues 中指定的时间 单击并查看消息线程
  • PyQt5 - 撤消实施

    我需要在此小部件中实现撤消功能 使用组合键 Ctrl Z 激活 我可以在传递给构造函数的输入中的图像上绘制线条 因此 我们的想法是从行列表中删除最后一项 我每次绘制一行时都会向此列表中添加一条行 并在按 Ctrl Z 时重新绘制所有其他行
  • 如何在 SwiftUI 中显示来自数据源(如 UITableView)的视图列表

    在 SwiftUI 中 我们有List代表可重复使用的物品 就像UITableView in UIKit 静态列表的构建如下 List Text cell Text cell Text cell Text cell 但好像是这样不可重复使用
  • 如何使用 page.find 通过 rspec 测试查找变量

    我有一个测试用例 我的大多数其他页面至少有一个字段只是纯文本 可以使用以下方式找到 page find tr text What I filled in find a tick click 本页所有选项都是下拉选择 那么如何找到变量呢 其余
  • Python 3.X 中 classname.attribute 和 self.attribute 有什么区别

    有如下两段代码 class State country China def init self print State country obj State and class State country China def init sel
  • 如何自动注入状态参数

    Abstract 你好 我在我的项目中使用 Angular ui router 我有大量的嵌套状态和不同的视图 这些视图又包含大量不同的输入 用户逐步增量地填充这些输入 问题 有时用户需要位于上一步的附加信息 浏览器的 后退 按钮可以帮助用
  • 如何在c中创建自定义数据包?

    我正在尝试使用 TCP IP 协议使用 C 语言制作自定义数据包 当我说自定义时 我的意思是能够更改数据包中的任何值 例如 MAC IP 地址等 我尝试四处搜索 但找不到任何实际指导我或给我示例源代码的东西 如何创建自定义数据包或者我应该在
  • 从 Facebook 墙到 Android 应用程序的新闻提要

    有什么方法可以将 Facebook 墙上的最后一个帖子转移到 Android 应用程序中吗 我想制作一些类似 RSS 阅读器来获取一些有关应用程序的信息 为了更好地解释 我在 Facebook 上有一个关于一个足球俱乐部的页面 在那里我发布
  • 对于项目外的文件,如何在java中将File转换为IFile?

    通常 此代码用于从File to IFile IWorkspace workspace ResourcesPlugin getWorkspace IPath location Path fromOSString file getAbsolu
  • 禁止网站上的机器人[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的网站经常宕机 因为蜘蛛正在访问许多资源 这是主持人告诉我的 他们告诉我禁止这些 IP 地址 46 229 164 98 46 229
  • 将自定义 css 添加到 WordPress 中的页面模板

    你好 我需要一些帮助来为我的页面模板创建自定义 css 文件 关于这个问题有很多主题 但随着我阅读的每个主题 我都会获得更多信息 也更加困惑 我为二十四主题创建了一个子主题 并添加了一个页面模板 我如何将自定义 css 添加到此模板 我发现
  • 在 sql 结果中填充空日期的最直接方法是什么(在 mysql 或 perl 端)?

    我正在从 mysql 表构建一个快速 csv 查询如下 select DATE date count date from table group by DATE date order by date asc 然后将它们转储到 perl 中的
  • 将weld-se 与 Gradle 应用程序插件一起使用时出现 Bean 发现问题

    我正在构建一个基于 Gradle 的 Java SE 应用程序 该应用程序构建在 Hibernate 之上 作为我选择的 ORM 我的计划是使用weld se能够使用 CDI 注释进行注入EntityManagers整个申请过程中 基于共同