java - CDI 对象不能用注入(inject)的构造函数代理

标签 java dependency-injection cdi weld

当尝试将参数注入(inject) CDI bean (ApplicationScoped) 的构造函数时,我遇到了以下问题:

Caused by: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435: Normal scoped bean class xx.Config is not proxyable because it has no no-args constructor - Managed Bean [class xx.Config] with qualifiers [@Default @Named @Any].
    at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.validateNoargConstructor(DefaultProxyInstantiator.java:50)
    at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:217)
    at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:178)

但是,我在类上确实有一个可注入(inject)的构造函数:

@Inject
public Config(ConfigLocator configLocator) {
    defaultConfigPath = configLocator.getPath();
    doStuff();
}

使用默认构造函数、变量注入(inject)和后构造方法,这一切都可以正常工作,但在这种情况下我更喜欢构造函数注入(inject)。

想知道这里出了什么问题吗?

最佳答案

我们解决了将类拆分为接口(interface)和实现的类似问题。 在你的情况下是这样的:

public interface Config
{
  // API here
}

@ApplicationScoped @Priority(0)
public class ConfigImpl implements Config
{
  @Inject
  public ConfigImpl(ConfigLocator configLocator) { ... }

  // API implementation here
}

关于java - CDI 对象不能用注入(inject)的构造函数代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46543657/

相关文章:

jersey - Jersey/CDI 2.0/Weld 3.0 所需的依赖项

java - 当 bash 脚本通过 Java 代码运行时,如何在 Linux 中将用户设置为 root

java - JsonArrayRequest 在 Android Studio 中不起作用 : Can not resolve constructor

c# - MVC 3 beta + Dependency Resolver + Unity = 有​​问题

java - Spring 通过 xml 文件中的构造函数传递 Class<?>

default - 带有拦截器的 CDI bean 应该有默认构造函数吗?

java - Spark 数据帧 : How can I change the order of columns in Java/Scala?

java - 无法直接在 JFrame 上绘画

c# - Entity Framework 、依赖注入(inject)和共享对象

java - 使用 CDI 的简单 Faces Flow 中的 ContextNotActiveException