问题标签 [jboss-weld]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
13336 浏览

jakarta-ee - 如何使用 Weld 注入不可序列化的类(如 java.util.ResourceBundle)

我想创建一个 Producer,它可以将 java.util.ResourceBundle 注入任何类,以便轻松获取本地化字符串。我的 ResourceBundle-Producer 如下所示:

Locale 和 FacesContext 的注入有效(从 Seam 3 Alpha Source 获取相应的生产者)。但不幸的是,ResourceBundle 不是可序列化的,因此不能以这种方式生成。尝试访问调用使用我的 ResourceBundle 的 bean 的 JSF 页面时,我从 Weld 收到以下错误:

Caused by: org.jboss.weld.IllegalProductException: WELD-000054 Producers cannot produce non-serializable instances for injection into non-transient fields of passivating beans\\n\\nProducer\: org.jboss.weld.bean-/D:/Program Files (x86)/GlassFish-Tools-Bundle-For-Eclipse-1.2/glassfishv3/glassfish/domains/teachernews/applications/teachernews/-ProducerMethod-services.producers.ResourceBundleProducer.getResourceBundle()\\nInjection Point\: field web.PersonHome.bundle

有什么方法可以让我的 ResourceBundleResolver 工作吗?还是有任何其他机制可以获得类似的功能?提前致谢!

编辑:

好的,我会花掉一些我辛苦赚来的积分;)也会接受一个很好的解决这个问题的方法!

我得到了另一个无法创建 Producer 的示例:FlashProducer。FacesContext-Flash 也无法生成,因为 Flash 不可序列化。

0 投票
1 回答
790 浏览

cdi - 我应该在哪里申报我的 CDI 资源?

JSR-299 (CDI) 引入了资源的(不幸命名)概念:http: //docs.jboss.org/weld/reference/1.0.0/en-US/html/resources.html#d0e4373

您可以将此命名法中的资源视为 Java EE 6 品牌的依赖注入(@EJB、@Resource、@PersistenceContext 等)和 CDI 的依赖注入品牌之间的桥梁。

一般的要点似乎是在某个地方(这将是我的问题的根源)您声明什么相当于一个桥接类:它包含使用 Java EE 的 @EJB 或 @PersistenceContext 或 @Resource 注释以及 CDI 的 @Produces 注释的字段注释。最终结果是 Java EE 6 注入了持久性上下文,例如,在需要它的地方,CDI 将注入的 PersistenceContext 识别为未来注入的源(由@Inject 处理)。

我的问题是:社区的共识是什么——或者是否有一个——关于:

  • 这个桥接类应该被命名为什么
  • 这个桥牌班应该住在哪里
  • 最好将所有这些东西本地化到一个类中还是制作几个类

...?

留给我自己的设备,我正在考虑声明一个名为的类CDIResources并将其用作将 Java EE 的 DI 与 CDI 的 DI 链接的唯一真实位置。许多示例都做了类似的事情,但我不清楚它们是否“只是”示例,或者这是否是一个好方法。

谢谢。

0 投票
1 回答
301 浏览

inversion-of-control - 如何使用 CDI (WELD) 级联依赖关系解析

我想要一个中央焊接容器来容纳我所有的服务等等。然而,该容器将被包含本地设置的第二个容器包装。目标是如果在外部容器中找不到依赖项,那么我想搜索内部容器。

我怎样才能做到这一点?我更愿意以站立的方式做事,而不是恢复使用非标准 WELD 扩展。

0 投票
1 回答
983 浏览

guice - 在 CDI(WELD) 中是否有一个等价物来构建定义(就像在 Guice 模块中所做的那样)然后创建一个注入器?

我喜欢 Guice 让手动创建自己的模块变得相当简单的方式,每个模块都有自己的代码绑定。另一方面,CDI 似乎更多地依赖魔术而不是对 sest 绑定的编程访问。我错了吗,或者如何使用 WELD 达到相同的效果。

任何代码示例将不胜感激...

澄清

我希望使用 Guice 在http://code.google.com/p/google-guice/上给出的构建器模式样式以编程方式构建一个模块(Guice 术语对不起我不确定 CDI 术语)。

我正在构建一个动态系统,我需要能够绑定类型(如接口)、常量等,而不仅仅是让 Weld 动态扫描类路径等并查找和注册类型。我相信 CDI 是静态的 javax.inject 包不包含任何允许以编程方式将类型绑定到实现的接口。

澄清第 2 部分

原始问题的基本前提是简单的观察,即注释已被烘焙,并且其中定义的用于帮助注入器的规则无法更改。我最初希望公共访问与 CDI 类路径扫描器用于为其内部使用构建定义的相同接口。基本上我说的是,我想要一个允许我阅读注释并为容器创建定义的层。默认提供者可能是现在发生的事情,但是如果您想要其他策略,那么就有可能做到这一点。

当前方法的一个问题是不能重用具有不同注释的组件(类)来选择不同的协作者。在你跳之前,让我限定这个陈述,是的,它可以通过提供者等来完成,但这会导致更多的工件。应该有更简单的方法。

示例 1

对不起,如果这个例子很糟糕,我的用例会涉及更多,细节会妨碍阅读时间。

想象一下,有一个 url 重写组件,为了参数,它有一些参数,比如

  • 用那个模式替换这个模式。
  • 也许是一个 html 清洁器

如果您希望使用两个不同的替换规则注入相同的组件,但有 html 清洁器注入器,那么您就卡住了。当然有办法解决这个问题,但它们需要人工制品,这当然是更多的代码。

不幸的是,所有绑定规则都在类上而不是实例上,因此每次你请求一个类时,你都会得到一个功能上相当的实例。

焊接

这个问题是很久以前写的,我已经放弃了 Weld。我相信它决定其魔法的方式是错误的。我不喜欢他们在没有为我提供控制何时或如何重复此操作的方法的情况下向我指示这是如何发生的事实。我不喜欢这种不灵活。

0 投票
1 回答
365 浏览

java - CDI - 有条件的安装

我有几个应用程序范围的组件。根据我所处的环境,我想安装一个或另一个。在 JBoss Seam 中,我会使用 @Install(false),然后通过 components.xml 配置我想要的 bean。

在 CDI / WELD 中有类似的方法吗?

谢谢,

沃尔特

0 投票
1 回答
1598 浏览

java - CDI - 处理错误

我正在将我的 Seam 2 支持的应用程序迁移到 CDI,而对我来说至关重要的一件事就是错误处理。在 Seam 2 中,我只是用我自己的替换了默认的异常处理程序,但在 CDI 中,我猜我将不得不使用一个拦截器。

我将如何设置它,因为使用拦截器需要我指定它将在哪里拦截呼叫?我主要想完成审计,所以当发生异常时,它会被记录下来,然后向管理员发送通知(电子邮件、xmpp、短信、电话)。

当异常发生时,是否有一个我可以监听并采取行动的事件?

沃尔特

0 投票
2 回答
1450 浏览

asynchronous - 使用 EJB3.1 @Asynchronous 时如何避免 ConcurrentModificationExceptions

[我的设置:Java EE 6 应用程序,EJB3.1、CDI/Weld、JSF2 在 Glassfish 3.0.1 上运行]

我阅读了一些关于 EJB3.1 中新的@Asynchronous 方法的文章,但没有一篇文章提到异步方法的危险以及您真正需要关心的内容。

在我的应用程序中,我有一个@Asynchronous E-Mail 服务,发送大量邮件。我从 CDI/Weld Bean 调用此服务。在我的测试过程中,我经常遇到 ConcurrentModificationExceptions,但直到现在我才真正理解它有时在哪里以及为什么会崩溃。

只是为了展示我的 Beans 大致是什么样子,重要的部分:

在我的 CDI-Bean 中,我像这样使用这个 EJB(向 JSF2 公开进度):

我只是想问一下:我在这里做错了什么吗(范围、注入、使用 Future)?使用 @Asynchronous 方法时我需要注意什么以避免 ConcurrentModificationExceptions?

我将电子邮件作为 EJB 注入。把整个EmailEJB做成异步,用@Inject @Asynchronous注入会不会更好?会有什么区别?

欢迎任何提示!

0 投票
1 回答
934 浏览

java - 使用 Wicket 从超级/抽象类调用方法时焊接注入失败

我遇到了焊接检票口问题。当@Inject-ing 从抽象类继承的 EJB 时,如果我尝试从抽象类调用方法,我会收到 ejb-ref 错误。但是,如果我从具体类中调用一个方法,它就可以完美地工作。我可以重写方法并调用它们,我可以将一个重写的方法委托给抽象类(让重写的方法调用 super.method()),这样就可以了。我必须对抽象类进行某种配置吗?

谢谢。

0 投票
1 回答
4672 浏览

java - 在 Eclipse 中运行一个非常简单的 Weld SE 项目

我一直在我的 Web 应用程序中使用 Seam 2(也开始研究 Java EE 6),几天前我发现可以在带有 Weld 的 SE 应用程序中利用 Seam 的 CDI。根据 Weld 的Weld SE文档页面,设置很简单。因此,我尝试使用单个类 HelloWeld、weld-se.jar 和 log4j jar 设置 Eclipse 项目。

我创建了一个新的 Java 应用程序运行配置并指示org.jboss.weld.environment.se.StartMain为主类。当我运行这个项目时,我毫不意外地发现,HelloWeld 从未被调用过。我得到的只是一些日志条目,作为 Weld 正确启动的指示:

那么我错过了什么?

0 投票
1 回答
2287 浏览

glassfish - 在 Glassfish 中将 @Stateless EJB 的 CDI(焊接)注入到 @SessionScoped JSF2 bean 中的“无法将 ejbRef 转换为 ejb”

[更新:在http://forums.java.net/jive/thread.jspa?messageID=480532讨论 Glassfish 论坛/ML 后,针对 Glassfish https://glassfish.dev.java.net/issues提交了一个错误/show_bug.cgi?id=13040对于这个问题。]

我正在尝试将 @Stateless EJB 的本地无接口视图注入 JSF2 @Named @javax.enterprise.context.SessionScoped 支持 bean。EJB 是扩展抽象通用基类的几个之一。注入“@Inject TheEJBClass varName”失败,并显示“无法将 ejb TheEJBClass 的 ejbRef 转换为 my.package.name.TheAbstractBase 类型的业务对象”。[编辑:实际上,事实证明注入成功,但是从超类继承的方法的注入代理中的方法解析失败。]如果我使用“@EJB TheEJBClass varName”,则 varName 保持为空,即没有注入任何内容。

细节:

我在 Linux 上运行 Glassfish 3.0.1(Ubuntu 10.04 以防万一)并且在处理使用 CDI(焊接)将我的数据模型 EJB 注入到我的 JSF2 会话范围模型中时遇到了实际问题。是的,在你问之前,我已经准备好 beans.xml 并且 CDI 正在激活以执行注入。

如果我用 @EJB 注释注入它,例如:

... EJB 实际上并没有被注入,因此 memberName 为空。

如果我用 CDI @Inject 注释注入它:

...然后,当我调用在 TheEJBClass 的超类中实现且未在 TheEJBClass 中覆盖其自身的“memberName”方法时,CDI 会抱怨,报告:

我已经尝试将基础转换为具体类并对其进行反泛化,但遇到了同样的问题,所以我认为我不会使用通用基础来解决 Weld 错误(https://jira.jboss.org/browse /WELD-305,https://jira.jboss.org/browse/WELD-381,https://jira.jboss.org/browse/WELD-518)。_ _ _

为清楚起见,添加了注释的完整包限定的代码大纲是:

请注意,如果我在 TheEJBClass 中覆盖 TheAbstractBase.getValue(),或者如果我调用在 TheEJBClass 中定义的方法而不是任何超类,则注入确实有效。似乎这个问题与继承有关。

使用 JSF2 的内置生命周期和注入功能的非常相似的代码有效,但鉴于这是一个新项目,而且 CDI 是未来的发展方向,我认为最好尝试使用 CDI。这是我开始使用 JSF2/EJB 注入的方法,它有效:

我目前正在整理一个独立的测试用例,但我想我现在会提出这个问题,以防我只是在做一些愚蠢的事情,或者我的 Google-fu 有一个众所周知的解决方案'直到找到。为什么它适用于 JSF2/EJB 注入,但会因 CDI 注入而失败?

(由于在 Glassfish 论坛上重新发布为http://forums.java.net/jive/thread.jspa?threadID=152567