我使用的Unbound ID库具有LDAPConnection类,该类没有默认构造函数,并且实现了LDAPInterface。我产生LDAPConnection如下:
@Produces
@SimpleLdapConnection
@ApplicationScoped
public LDAPInterface createLdapConnection() throws GeneralSecurityException, LDAPException {
LDAPConnection conn = new LDAPConnection(host, port, username, password);
return conn;
}
我现在想将此LDAPConnection类注入第二个生产者,后者应生成一个连接池:
@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.LDAPInterface $ 1687649628 $ Proxy $ _ $$ _ WeldClientProxy 无法转换为com.unboundid.ldap.sdk.LDAPConnection
在at.rsg.lp.benutzerverwaltung.business.repository.LdapConnectionPoolProvider.produceLdapConnectionPool(LdapConnectionPoolProvider.java:59)
如何解决该错误? 附言更改第一个生产者以返回LDAPConnection无效,因为出现错误“注入的普通作用域bean无法代理”。
答案 0 :(得分:1)
从CDI角度来看,您正在遇到的是生产者方法的已定义bean类型。这由CDI specification支持。
简而言之,对于生产者方法,bean类型是从返回类型及其实现的接口派生的。例如。实际的实现类型不包括在内。这样做的原因正好是您尝试返回实际的实现类型时看到的结果-impls通常包含final
方法或使它们unproxyable的其他颠簸。
我可以想到两件事来解决这个问题:
@Typed
注释-我怀疑在这种情况下是否可以使用,但值得一试。该注释声明了bean将具有的所有类型。您将这样使用它-@Typed({LDAPInterface, LDAPConnection})
。