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