无法投射 WeldClientProxy

WeldClientProxy cannot be cast

我使用具有 class LDAPConnection 的 Unbound ID 库,它没有默认构造函数并且实现了 LDAPInterface。我按如下方式生成 LDAPConnection:

@Produces
@SimpleLdapConnection
@ApplicationScoped
public LDAPInterface createLdapConnection() throws GeneralSecurityException, LDAPException {
    LDAPConnection conn = new LDAPConnection(host, port, username, password);
    return conn;
}

我现在想将这个 LDAPConnection class 注入第二个生产者,它应该生成一个连接池:

@Inject
@SimpleLdapConnection
LDAPInterface simpleLdapConnection;

@Produces
@Default
@ApplicationScoped
public LDAPInterface produceLdapConnectionPool() throws GeneralSecurityException, LDAPException {
    LDAPConnectionPool pool = new LDAPConnectionPool((LDAPConnection)simpleLdapConnection.g, connectionPoolInitialSize, connectionPoolMaxSize);
    return pool;
}

要创建 LDAPConnectionPool,我需要将 simpleLdapConnection 转换为 LDAPConnection(因为它必须是 LDAPConnection)。

但是,我收到错误消息:

java.lang.ClassCastException: org.jboss.weld.proxies.LDAPInterface87649628$Proxy$_$$_WeldClientProxy cannot be cast to com.unboundid.ldap.sdk.LDAPConnection

at at.rsg.lp.benutzerverwaltung.business.repository.LdapConnectionPoolProvider.produceLdapConnectionPool(LdapConnectionPoolProvider.java:59)

如何解决这个错误? P.S。将第一个生产者更改为 return LDAPConnection 不起作用,因为我收到错误 "Injected normal scoped bean is not proxyable".

从 CDI 的角度来看,您 运行 进入的是生产者方法的已定义 bean 类型。这是由 CDI specification.

支持的

简而言之,对于生产者方法,bean 类型派生自 return 类型及其实现的接口。例如。实际的实现类型是 not included。其原因正是您在尝试 return 实际实现类型时所看到的 - impls 通常包含 final 方法或其他使它们成为 unproxyable.[=15= 的颠簸]

我能想到两件事来解决这个问题:

  1. [这个很可能会失败]尝试在你的生产者身上添加 @Typed 注释 - 我怀疑它在这种情况下是否有效,但是值得一试。此注释声明了 bean 将具有的所有类型。你会像这样使用它 - @Typed({LDAPInterface, LDAPConnection}).
  2. [这应该是一个首选选项]如果我是你,我会像你建议的那样创建一个包装器对象。它不会真的那么难看,只需几段代码就可以解决问题。