无法强制转换WeldClientProxy

时间:2018-08-10 14:08:30

标签: cdi weld unboundid-ldap-sdk

我使用的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无法代理”。

1 个答案:

答案 0 :(得分:1)

从CDI角度来看,您正在遇到的是生产者方法的已定义bean类型。这由CDI specification支持。

简而言之,对于生产者方法,bean类型是从返回类型及其实现的接口派生的。例如。实际的实现类型不包括在内。这样做的原因正好是您尝试返回实际的实现类型时看到的结果-impls通常包含final方法或使它们unproxyable的其他颠簸。

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

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