将cdi bean注入jax-rs控制器时,无法将$ Proxy $ _ $$$ _ WeldClientProxy强制转换为javassist.util.proxy.ProxyObject

时间:2019-01-06 21:10:21

标签: hibernate java-ee jax-rs weblogic12c javassist

我试图创建一个Jax-rs控制器,并将一个CDI bean注入到该contoller中,但是应用程序给出了以下异常。

当我不注入豆子的时候效果很好。

该项目还使用Hibernate,并且具有javassist依赖性。当我删除此依赖项时,我可以毫无问题地将Bean注入控制器,但是在这种情况下,休眠状态当然不起作用。

什么可能导致此异常?

我正在使用weblogic 12.1.3服务器。

这是我要注入的服务bean

@Named("AccountBcImpl")
public class AccountBcImpl extends AccountBaseBcImpl implements AccountBc {
   ...
}

这是jax-rs控制器

@Named
@javax.enterprise.context.ApplicationScoped
@Path("/build")
public class BuildCotroller {

    @Inject
    private AccountBc accountBc;



    public String getBuilding(@QueryParam("buildId") Long buildId) throws BaseException {
        return "Hello";
    }
}

Stacktrace:

]] Root cause of ServletException.
org.jboss.weld.exceptions.WeldException: WELD-000830 Unable to load the cache value for the key Managed Bean [class com.aaa.bbb.web.rest.BuildController] with qualifiers [@Default @Any]
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:73)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:112)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:93)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientProxyProvider.java:102)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:621)
    Truncated. see log file for complete stacktrace
Caused By: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.ClassCastException: com.aaa.bbb.web.rest.BuildController$Proxy$_$$_WeldClientProxy cannot be cast to javassist.util.proxy.ProxyObject
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2234)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3965)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3969)
    at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4829)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:71)
    Truncated. see log file for complete stacktrace
Caused By: java.lang.ClassCastException: com.aaa.bbb.web.rest.BuildController$Proxy$_$$_WeldClientProxy cannot be cast to javassist.util.proxy.ProxyObject
    at org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:249)
    at org.jboss.weld.bean.proxy.ClientProxyFactory.create(ClientProxyFactory.java:105)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:87)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.access$000(ClientProxyProvider.java:43)
    at org.jboss.weld.bean.proxy.ClientProxyProvider$1.load(ClientProxyProvider.java:53)
    Truncated. see log file for complete stacktrace

1 个答案:

答案 0 :(得分:1)

我对此感到内,因为我从未使用过Javassist,因此更像是一种直觉。但是您的问题听起来可能是罐子冲突。

使用maven的任何人实际上都应该将ENFORCER插件作为其构建的一部分。这是一个巨大的痛苦,因为大多数项目在第一次运行时将花费大约半天的时间来消除所有冲突的传递依赖项。这会让您想知道没有它的任何程序是如何工作的。

无论如何,这里有一个pom代码片段,可让您运行执行者:强制目标以及将自身绑定到VALIDATE目标。

let replace = str.replacingOccurrences(of: "\\S", with: "_", options: .regularExpression)