当前位置: 首页 > 知识库问答 >
问题:

焊接容器没有注入正确的对象,它返回NULL

莫欣悦
2023-03-14

我正在玩焊接CDI配置。我遇到了返回空值的问题。理论上,我的配置应该使适当的对象实例创建,但我找不到理由它不...

我查找了类似的问题,但大多数问题都与在瞬时对象时使用new关键字有关。另一个建议是使用应用服务器。我在经营野蝇,所以也不是这样。

日志:

Feb 17, 2021 12:12:18 AM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 4.0.0 (Final)
Feb 17, 2021 12:12:19 AM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
Feb 17, 2021 12:12:19 AM org.jboss.weld.environment.se.WeldContainer fireContainerInitializedEvent
INFO: WELD-ENV-002003: Weld SE container 75c04868-bd06-4acb-874c-db603ada27b0 initialized
Exception in thread "main" java.lang.NullPointerException
    at MessagePrinter.printMessage(MessagePrinter.java:9)
    at Main.main(Main.java:10)
Weld SE container 75c04868-bd06-4acb-874c-db603ada27b0 shut down by shutdown hook

Process finished with exit code 1

以下是我的设置:

beans.xml非常简单

<?xml version="1.0"?>
<beans bean-discovery-mode="all" version="1.1"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"/>

主类创建焊接容器

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class Main {
    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();

        MessagePrinter printer = container.select(MessagePrinter.class).get();
        printer.printMessage();

        weld.shutdown();
    }
}

MessagePrinter类

import javax.inject.Inject;

public class MessagePrinter {

    @Inject
    private MessageProducer messageProducer;

    public void printMessage() {
        String message = messageProducer.getMessage();
        System.out.println(message);
    }
}

所以上面的MessageProducer变量始终为null,尽管只有一个现有的MessageProducer实现(标记为@default)应该被注入...

MessageProducer接口

public interface MessageProducer {

    public String getMessage();
}

SimpleMessageProducer类(MessageProducer实现)

import javax.enterprise.inject.Any;
import javax.enterprise.inject.Default;

@Default
@Any
public class SimpleMessageProducer implements MessageProducer {

    @Override
    public String getMessage()  {
        return "Example message " + System.currentTimeMillis();
    }
}

项目结构:

-src 
--java 
---FileMessage 
---FileMessageProducer 
---Main 
---MessagePrinter 
---MessageProducer 
---SimpleMessageProducer 
-resources 
--META-INF 
---beans.xml 

共有1个答案

艾骏
2023-03-14

由于您正在使用Weld4.0.0.final,因此应该使用jakarta.inject名称空间,而不是javax.inject。

您可能会遇到由于重叠类路径而导致的问题。只保留org.jboss.weld.se:weld-se-core:4.0.0.final依赖项,您可能就会没事。

 类似资料:
  • 我有一个表格和一个表格。包含所有课程的列表,包含教授/协助该课程的志愿者列表。 我想写一个查询,返回没有任何志愿者分配给它的所有课程的列表。这就是正在发生的事情: 以下所有查询都返回 course_id 3 course_id 4 course_id 5 为什么course_id 1(正确)被遗漏,而course_id 3却不是??? 同样的问题,但没有一个解决方案对我有效: 左侧外部连接轨4

  • 问题内容: 我使用mysql 5.7 我想将联接表的结果串联到单列中。我使用包裹在函数中的函数。这是查询 列包含来自联接表的数据。数据已正确检索,但问题是列未转换为正确的JSON。 如您所见,最后有点“切”。 我也尝试过,但是现在它不能转换为正确的数组。它看起来像字符串太大,不适合列。有办法解决吗? 更新 问题必须出在不适合列的st大小中。我尝试从联接表中选择较少的列,并且它可以正常工作。也许有一

  • 有一个简单的Mongo DB生产者连接到Mongo数据库 我的src/main/resources/meta-inf中的一个资源文件 WeldContext和WeldJUnit4Runner来自这里-http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/

  • 意识到递归是我的弱点之一后,我找到了一个网站,迫使你递归地解决简单问题(https://codestepbystep.com/problem/view/cpp/recursion/digitsSorted?problemsetid=15) 我坚持的一个(digitalsSorted,数字5)如下:调用一个传递数字作为参数的函数。如果该数字中的数字按递增顺序排序,则函数返回True,否则返回Fals

  • 问题内容: 我有一个我以前从未见过的问题,猫鼬的findByIdAndUpdate没有在回调中返回正确的模型。 这是代码: 数据库中的原始文档如下所示: 进入的updateObj如下所示: 从回调返回的模型与原始模型相同,而不是updatedObj。如果我查询数据库,它已正确更新。它只是没有从数据库中返回。 这感觉像是一个“愚蠢的用户”错误,但我看不到它。任何想法表示赞赏。 问题答案: 在Mong

  • 问题内容: 比方说,我有一个名为接口,以及三种实现- ,和。 现在,我希望每当我的托管bean(或任何Web组件)收到一条消息时,便在所有社交网络中共享它。我试过了: 但这没有用(部署错误)。(也尝试了预选赛-同样的结果) 那么,有没有办法注入接口的所有(或某些)实现的列表? 我知道给定注入点不应包含多个可能的bean的规则。我想我可以通过创建一个产生列表的生产者并使用来实现这一点,但这对于这项任