使用 CDI 注入命名字符串

2023-11-25

我想以这种方式注入配置参数:

public class MyManagedBean {
    @Inject
    public MyManagedBean(@Named("user") String user){
        ....

    }
}

所以我尝试这样实现生产者方法:

@ApplicationScoped
public class MyConfiguration {
    private Properties loadProperties() {
        Properties properties = new Properties();
        try {
            properties.load(getClass().getResourceAsStream(
                    "user.properties"));
        } catch (IOException e) {
            throw new RuntimeException();
        }
        return properties;
    }

    @Produces
    @Named("user")
    String getUser() {
        return loadProperties().getProperty("user");
    }
}

我还有这样定义的其他 bean:

public class OtherManagedBean {
    @Inject
    public OtherManagedBean(MyManagedBean myManagedBean){
        ....

    }
}

但是,当我尝试部署它时遇到此异常:

INFO: WEB0671: Loading application [example-ear#example-war.war] at [example]
SEVERE: Exception while loading the app
SEVERE: Exception while loading the app : WELD-001410 The injection point [parameter 1] of [constructor] @Inject public com.example.OtherManagedBean(MyManagedBean) has non-proxyable dependencies
org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001410 The injection point [parameter 1] of [constructor] @Inject public com.example.OtherManagedBean(MyManagedBean) has non-proxyable dependencies
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:317)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:139)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:162)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:385)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:371)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:390)
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:190)
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:128)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:298)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)
    at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
    at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:662)

任何想法?

Thanks.


It looks like you need a default (no-arg) constructor for your MyManagedBean to make it proxyable. I am not really sure about why it is needed, since MyManagedBean is a @Dependent bean and so is not proxied AFAIK; I do not know even why a proxyable bean needs a default constructor, to be honest This seems to be an implementation detail or a little point from CDI specification that was ignored. Anyway, I bet it can make a good new question :)

EDIT:我发现了为什么可代理 bean 需要默认构造函数。实际上,这并不神秘:由于 bean 的代理是同一 bean 的子类,因此代理需要调用super()构造函数在它自己的构造中。如果它没有非私有默认构造函数,则它不知道要调用哪个构造函数。人们甚至可以想象这样一种场景:调用注入的构造函数来创建代理,但我不知道它会给 CDI 实现增加哪种复杂性;可能没那么容易做到...

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

使用 CDI 注入命名字符串 的相关文章

随机推荐

  • 使用 JWT 验证套接字 io 连接

    如何验证 socket io 连接 我的应用程序使用来自另一台服务器 python 的登录端点来获取令牌 每当用户在节点端打开套接字连接时 如何才能使用该令牌 io on connection function socket socket
  • 上传json数据时如何按百分比显示进度条状态?

    我正在上传字符串和照片 它工作正常 现在我想在上传百分比数据时显示进度条 但百分比很快显示到 100 百分比 并且需要更多时间上传 最后到达后执行方法 protected class upload images extends AsyncT
  • 如何使 Django 的“DATETIME_FORMAT”处于活动状态?

    应该在哪里DATETIME FORMAT放置以使其发挥作用 在 Django 管理站点中显示日期时间 Django 的自动管理界面 文档用于DATETIME FORMAT 页上http docs djangoproject com en 1
  • 从 pyaudio-stream 获取浮点数形式的音频样本

    由于我目前正准备构建一个基于 Raspberry Pi 的设备 用于测量声卡记录的噪声 例如方差 中的一些内容 并尝试在 python 中执行此操作 所以我陷入了如何获取音频样本的困境中用于进一步计算的浮点数 我做了什么 使用线路输入适配器
  • 如何将 telnet 控制台日志重定向到文件 Linux

    我想将 telnet 控制台日志重定向到 Linux 中的文件 例如 telnet someIp gt someFile ls exit 我希望控制台日志保存在文件名中someFile 我在用tcl用于自动化此操作 截至目前 我正在做spa
  • 使用带有 Kerberos 身份验证的 impyla 客户端连接到 Impala

    我在 W8 机器上 使用 Python Anaconda分布 连接到Impala in our Hadoop集群使用Impyla包裹 我们的 hadoop 集群是通过以下方式保护的Kerberos 我已遵循API参考如何配置连接 from
  • 如何更改 Eclipse 中的*默认*默认编码?

    每次创建新工作区时 Eclipse 都会默认使用 Cp1250 编码 每当我创建项目的新分支并切换到 Eclipse 中的新工作区时 我需要转到窗口 gt 首选项 gt 常规 gt 工作区 文本文件编码并手动切换到 其他 UTF 8 如果我
  • 如何对使用 thymeleaf 的安全控制器进行单元测试(不会出现 TemplateProcessingException)?

    我正在尝试使用 spring security 和一个简单的家庭 根 控制器在 spring boot 中运行单元测试 该控制器使用 thymeleaf 进行模板处理 我正在尝试编写一些单元测试来验证我的安全权限是否正常工作以及我的模板 使
  • 更改不可变对象 F#

    我认为这个标题是错误的 但无法创建一个能够抽象地反映我想要实现的目标的标题 我正在编写一个调用服务并以 JSON 字符串形式检索数据的函数 该函数使用 a 来解析字符串JSON 类型提供者 在某些情况下 我想修改该 JSON 对象的属性 然
  • 如何使 Tomcat 中的所有会话过期?

    我想使 Tomcat 中的所有会话过期 我们在 Fitnesse 下测试我们的产品 并且仍然保留一些会话 会话结束会导致测试之间存在依赖性 我使用以下代码手动完成此操作 但仍然存在一些会话 我可以使用http localhost 8080
  • 寻找一个好的 jQuery 数据网格插件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要让我的用户维护一些帐户和住宿 每个帐户可以1到多个住宿 每个住宿仅链接到1个帐户 我希望能够让用户编辑帐户详细信息 在同一页面上 我想列出链接
  • 以超级用户身份从 python 脚本运行命令

    因此 我试图使用子进程从 python 脚本中获取一个以超级用户身份运行的进程 在 ipython shell 中类似 proc subprocess Popen sudo apach2ctl restart shell True stdi
  • 将文件添加到 CMake 但不编译它们

    我的公司有自己的 idl 编译器 并且我让 CMake 生成文件作为构建过程的一部分 我希望 idl 文件位于 Visual Studio 项目中 但这意味着我最终会遇到微软尝试使用 midl 编译 idl 文件 失败得很惨 我知道我的问题
  • Emacs 热键对齐等号

    我想在我的 emacs 中添加这样的内容 local set key kbd C c a lambda interactive align regexp region beginning region end 但每当我运行它时 我都会收到错
  • 如何将napi_threadsafe_function用于NodeJS Native Addon

    我一直在寻找NAPI文档尝试并理解它是如何处理的multithreading 根据文档napi create threadsafe function and napi call threadsafe function 用于创建和调用js f
  • 数学问题:根据外角半径/厚度确定内边框的角半径

    这是数学高手的数学 几何问题 不是我最强的科目 这是针对 WPF 的 但应该足够通用 可以解决以下问题 我有两个嵌入式边框元素 外部元素具有一定的角半径 R和边框厚度 T 给定这两个值 内边框的角半径应该是多少 R 设置为使得两个角边缘相交
  • ColdFusion 9中文件上传的脚本函数

    ColdFusion 9 中是否有与 cffile action upload 等效的 cfscript 查了一下文档 好像没有 更新 这是9 0 1更新中添加的http help adobe com en US ColdFusion 9
  • 如何将自定义身份验证提供程序集成到 IdentityServer4 中

    是否可以以某种方式扩展 IdentityServer4 来运行自定义身份验证逻辑 我需要根据几个现有的自定义身份系统验证凭据 并且很难找到扩展点来执行此操作 他们使用自定义协议 所有这些现有系统都具有客户端知道的 API 密钥的概念 Ide
  • 如何增加 Microsoft Graph API 订阅限制?

    我一直无法找到一种使用图表来订阅所有用户更改的方法 它看起来不可能 因此 我开始单独订阅每个人 理想情况下我最终希望获得日历 电子邮件和联系人的所有更新 但我从日历开始 该代码仅适用于我的用户 但是当我尝试为每个人 大约 300 个用户 订
  • 使用 CDI 注入命名字符串

    我想以这种方式注入配置参数 public class MyManagedBean Inject public MyManagedBean Named user String user 所以我尝试这样实现生产者方法 ApplicationSc