java - Spring 3.x - Bean named 'zoneManagerDelegate' must be of type [com.ms.adsp.delegate.sapi.ZoneManagerDelegate], but was actually of type [$Proxy20] -
i have huge complex spring project. when added new class:
@service("zonemanagerdelegate") @cached(keygeneratorclass=serviceglobalkeygenerator.class,datawrapperclass=servicedelegatedatawrapper.class, tags = {"service", "sapi"}) public class zonemanagerdelegate extends sapidelegate<zonemanagerws> { public zonemanagerdelegate(){ super(zonemanagerws.class); } @cached public object[] getzones(salesusercontext usercontext) throws salesapiexception { return getws().getzones(usercontext); } } and run project, encountered error output:
severe: exception sending context initialized event listener instance of class org.springframework.web.context.contextloaderlistener org.springframework.beans.factory.beancreationexception: error creating bean name 'conversionservice' defined in servletcontext resource [/web-inf/context/common.xml]: cannot resolve reference bean 'rtchargeentrydetailstobookedinsertioninfo' while setting bean property 'converters' key [14]; nested exception org.springframework.beans.factory.beancreationexception: error creating bean name 'rtchargeentrydetailstobookedinsertioninfo': injection of autowired dependencies failed; nested exception org.springframework.beans.factory.beancreationexception: not autowire field: private com.ms.adsp.objectfinder.objectfinderservice com.ms.adsp.bean.payment.converter.rtchargeentrydetailstobookedinsertioninfo.objectfinderservice; nested exception org.springframework.beans.factory.beancreationexception: error creating bean name 'objectfinderservice': injection of autowired dependencies failed; nested exception org.springframework.beans.factory.beancreationexception: not autowire method: public void com.ms.adsp.objectfinder.objectfinderservice.setobjectfinderexts(java.util.collection); nested exception org.springframework.beans.factory.beancreationexception: error creating bean name 'objectfinderextfactory': injection of resource dependencies failed; nested exception org.springframework.beans.factory.beannotofrequiredtypeexception: bean named 'zonemanagerdelegate' must of type [com.ms.adsp.delegate.sapi.zonemanagerdelegate], of type [$proxy20] @ org.springframework.beans.factory.support.beandefinitionvalueresolver.resolvereference(beandefinitionvalueresolver.java:329) @ org.springframework.beans.factory.support.beandefinitionvalueresolver.resolvevalueifnecessary(beandefinitionvalueresolver.java:107) @ org.springframework.beans.factory.support.beandefinitionvalueresolver.resolvemanagedset(beandefinitionvalueresolver.java:366) @ org.springframework.beans.factory.support.beandefinitionvalueresolver.resolvevalueifnecessary(beandefinitionvalueresolver.java:158) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.applypropertyvalues(abstractautowirecapablebeanfactory.java:1391) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1132) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:522) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:461) @ org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:295) @ org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:223) @ org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:292) @ org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:198) @ org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:915) @ org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:479) @ org.springframework.web.context.contextloader.configureandrefreshwebapplicationcontext(contextloader.java:383) @ org.springframework.web.context.contextloader.initwebapplicationcontext(contextloader.java:283) @ org.springframework.web.context.contextloaderlistener.contextinitialized(contextloaderlistener.java:112) @ org.apache.catalina.core.standardcontext.listenerstart(standardcontext.java:4206) @ org.apache.catalina.core.standardcontext.start(standardcontext.java:4705) @ org.apache.catalina.core.containerbase.addchildinternal(containerbase.java:799) @ org.apache.catalina.core.containerbase.addchild(containerbase.java:779) @ org.apache.catalina.core.standardhost.addchild(standardhost.java:601) @ org.apache.catalina.startup.hostconfig.deploywar(hostconfig.java:943) @ org.apache.catalina.startup.hostconfig.deploywars(hostconfig.java:778) @ org.apache.catalina.startup.hostconfig.deployapps(hostconfig.java:504) @ org.apache.catalina.startup.hostconfig.start(hostconfig.java:1317) @ org.apache.catalina.startup.hostconfig.lifecycleevent(hostconfig.java:324) @ org.apache.catalina.util.lifecyclesupport.firelifecycleevent(lifecyclesupport.java:142) @ org.apache.catalina.core.containerbase.start(containerbase.java:1065) @ org.apache.catalina.core.standardhost.start(standardhost.java:840) @ org.apache.catalina.core.containerbase.start(containerbase.java:1057) @ org.apache.catalina.core.standardengine.start(standardengine.java:463) @ org.apache.catalina.core.standardservice.start(standardservice.java:525) @ org.apache.catalina.core.standardserver.start(standardserver.java:754) @ org.apache.catalina.startup.catalina.start(catalina.java:595) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) @ java.lang.reflect.method.invoke(method.java:597) @ org.apache.catalina.startup.bootstrap.start(bootstrap.java:289) @ org.apache.catalina.startup.bootstrap.main(bootstrap.java:414) usage looks this:
@component public class objectfinderextfactory { @resource(name="zonemanagerdelegate") private zonemanagerdelegate zonemanagerdelegate; ... }
when remove @cached annotation in zonemanagerdelegate - it's working fine. other delegates extends sapidelegate - work fine too.
additional information:
public abstract class sapidelegate<t> implements applicationlistener<environmentreloaded> { private static final logger logger = logger.getlogger(sapidelegate.class); private t wsinstance; private final class<t> wsclass; public sapidelegate(class<t> wsclass){ this.wsclass = wsclass; } @override public synchronized void onapplicationevent(environmentreloaded appreloaded) { wsinstance = null; logger.debug("sales api client invalidated: " + wsclass.getname()); } /** * returns webservice client object */ protected synchronized t getws() { try { if (wsinstance == null) { wsinstance = clientfactory.createclient(wsclass, "adsalespro"); logger.debug("sales api client created: " + wsclass.getname()); } return (t) wsinstance; } catch (exception e) { throw new sapiexception(e); } } }
version:
spring 3.2.0
apache-tomcat-6.0.36
any ideas? thanks.
to me seems problem lays in not programming against interfaces.
try define interface this:
public interface zonemanagerdelegateinterface { public object[] getzones(salesusercontext usercontext) throws salesapiexception } and implement zonemanagerdelegate.
use referring it's interface:
@component public class objectfinderextfactory { @resource(name="zonemanagerdelegate") private zonemanagerdelegateinterface zonemanagerdelegate; ... update
another solution using cglib proxies instead of jdk dynamic proxies. can forced in spring configuration. note need cglib on classpath (not true since spring 3.2.0).
here interesting comparison of cglib proxies , jdk dynamic proxies
Comments
Post a Comment