将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 发现问题 的相关文章

  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • 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整个申请过程中 基于共同