Fixing BeanNotOfRequiredTypeException on Spring proxy cast on a non-singleton bean?

I'm having an issue with pulling a Spring bean from an application context. When I try; InnerThread instance = (InnerThread) SpringContextFactory.getApplicationContext().getBean("innerThread", InnerThread.class); I get; org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'innerThread' must be of type [com.generic.InnerThread], but was actually of type [$Proxy26] Without the specified class in the getBean() call I get a ClassCastException (which you can see in detail below). The InnerThread bean is being initialized as a non-singleton, because I need multiple instances. The InnerThread class also extends Thread. The interesting thing is that this error shows up within OuterThread, which is set up in the exact same way the InnerThread is. I've tried to include all relevant code listings/stack traces below. Could someone with more Spring experience tell me what is going on here? ---------- Code/Configuration Listing -------------------------- *OuterThread.java snippet:* public class OuterThread extends Thread { private Queue createInnerThreads() { Queue threads = new ArrayBlockingQueue(); ApplicationContext ctx = SpringContextFactory.getApplicationContext(); int i = 0; for (SearchRule search : searches) { logger.debug("Number of times looped " + i++); //Seprated lines to get a better sense of what is going on Object proxy = ctx.getBean("innerThread", InnerThread.class); logger.debug(ReflectionToStringBuilder.toString(proxy)); logger.debug("proxy.getClass(): " + proxy.getClass()); logger.debug("proxy.getClass().getClassLoader(): " + proxy.getClass().getClassLoader()); logger.debug("proxy.getClass().getDeclaringClass(): " + proxy.getClass().getDeclaringClass()); logger.debug("InnerThread.class.getClassLoader(): " + InnerThread.class.getClassLoader()); //---Exception here--- InnerThread cst = (InnerThread) proxy; threads.add(cst); } return threads; } public static void main(String[] args) throws Exception { try { OuterThread instance = (OuterThread) SpringContextFactory.getApplicationContext().getBean("outerThread", OuterThread.class); instance.run(); } catch (Exception ex) { logger.error("Fatal exception.", ex); throw ex; } } } *SpringContextFactory.java:* public class SpringContextFactory { static final Logger logger = LoggerFactory.getLogger(SpringContextFactory.class); private static ApplicationContext ctx; private static final String DEFAULT_PATH = "META-INF/app-context.xml"; public static ApplicationContext getApplicationContext() { return getApplicationContext(DEFAULT_PATH); } public static synchronized ApplicationContext getApplicationContext(String path) { if (ctx == null) return createApplicationContext(path); else return ctx; } private static ApplicationContext createApplicationContext(String path) { if (logger.isDebugEnabled()) logger.debug("Loading Spring Context..."); ctx = new ClassPathXmlApplicationContext(path); if (logger.isDebugEnabled()) logger.debug("Spring Context Loaded"); return ctx; } } *app-context.xml:* Stack Trace ----------- 2009-05-08 14:34:37,341 [main] DEBUG com.generic.OuterThread.init(OuterThread.java:59) - Initializing OuterThread object, com.generic.OuterThread@1c8fb4b[em=org.hibernate.ejb.EntityManagerImpl@e2892b,currentTime=java.util.GregorianCalendar[time=1241634874841,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2009,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=126,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=34,SECOND=34,MILLISECOND=841,ZONE_OFFSET=-18000000,DST_OFFSET=3600000],maxConcurrentThreads=5,reconId=3,reportUsername=TEST,useOffset=false,username=removed,uuid=bf61494d-ff96-431c-a41f-1e292d0c9fbe,name={T,h,r,e,a,d,-,1},priority=5,threadQ=,eetop=0,single_step=false,daemon=false,stillborn=false,target=,group=java.lang.ThreadGroup[name=main,maxpri=10],contextClassLoader=sun.misc.Launcher$AppClassLoader@11b86e7,inheritedAccessControlContext=java.security.AccessControlContext@1524d43,threadLocals=,inheritableThreadLocals=java.lang.ThreadLocal$ThreadLocalMap@2cbc86,stackSize=0,nativeParkEventPointer=0,tid=9,threadStatus=0,parkBlocker=,blocker=,blockerLock=java.lang.Object@a68fd8,stopBeforeStart=false,throwableFromStop=,uncaughtExceptionHandler=] 2009-05-08 14:34:37,341 [main] DEBUG org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.doJoinTransaction(ExtendedEntityManagerCreator.java:385) - No local transaction to join 2009-05-08 14:34:37,529 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:139) - Number of times looped 0 2009-05-08 14:34:37,529 [main] DEBUG org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:458) - Creating instance of bean 'searchThread' with merged definition [Root bean: class [com.generic.InnerThread]; scope=prototype; abstract=false; lazyInit=false; autowireCandidate=true; autowireMode=0; dependencyCheck=0; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [META-INF/app-context.xml]] 2009-05-08 14:34:37,545 [main] DEBUG com.generic.InnerThread.(InnerThread.java:50) - Constructing InnerThread object, com.generic.InnerThread@1080876[em=,coolScheme=,coolUrl=,date=,error=,millisecondsTaken=0,thresholdMet=false,reconId=0,result=-2,searchId=0,username=,uuid=,name={T,h,r,e,a,d,-,2},priority=5,threadQ=,eetop=0,single_step=false,daemon=false,stillborn=false,target=,group=java.lang.ThreadGroup[name=main,maxpri=10],contextClassLoader=sun.misc.Launcher$AppClassLoader@11b86e7,inheritedAccessControlContext=java.security.AccessControlContext@1524d43,threadLocals=,inheritableThreadLocals=java.lang.ThreadLocal$ThreadLocalMap@3aef16,stackSize=0,nativeParkEventPointer=0,tid=10,threadStatus=0,parkBlocker=,blocker=,blockerLock=java.lang.Object@126c6ea,stopBeforeStart=false,throwableFromStop=,uncaughtExceptionHandler=] 2009-05-08 14:34:37,545 [main] DEBUG org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:203) - Returning cached instance of singleton bean 'entityManagerFactory' 2009-05-08 14:34:37,545 [main] DEBUG org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:203) - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor' 2009-05-08 14:34:37,560 [main] DEBUG org.springframework.transaction.interceptor.AbstractFallbackTransactionAttributeSource.getTransactionAttribute(AbstractFallbackTransactionAttributeSource.java:108) - Adding transactional method [report] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT] 2009-05-08 14:34:37,560 [main] DEBUG org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.buildAdvisors(AbstractAutoProxyCreator.java:494) - Creating implicit proxy for bean 'searchThread' with 0 common interceptors and 1 specific interceptors 2009-05-08 14:34:37,560 [main] DEBUG org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:113) - Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.generic.InnerThread@1080876] 2009-05-08 14:34:37,591 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:141) - $Proxy26@1594a88[h=org.springframework.aop.framework.JdkDynamicAopProxy@1f0cf51] 2009-05-08 14:34:37,591 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:142) - proxy.getClass(): class $Proxy26 2009-05-08 14:34:37,591 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:143) - proxy.getClass().getClassLoader(): sun.misc.Launcher$AppClassLoader@11b86e7 2009-05-08 14:34:37,591 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:144) - proxy.getClass().getDeclaringClass(): null 2009-05-08 14:34:37,591 [main] DEBUG com.generic.OuterThread.createInnerThreads(OuterThread.java:145) - InnerThread.class.getClassLoader(): sun.misc.Launcher$AppClassLoader@11b86e7 2009-05-08 14:34:37,591 [main] ERROR com.generic.OuterThread.run(OuterThread.java:101) - Exception in OuterThread, ending reconciliation. java.lang.ClassCastException: $Proxy26 cannot be cast to com.generic.InnerThread at com.generic.OuterThread.createInnerThreads(OuterThread.java:148) at com.generic.OuterThread.run(OuterThread.java:65) at com.generic.OuterThread.main(OuterThread.java:170) ---------- Similar questions that do not answer my question ---------------------------------------- - [Auto-cast Spring Beans][1] - [ClassCastException when casting to the same class.][2] [1]: https://stackoverflow.com/questions/812178/auto-cast-spring-beans [2]: https://stackoverflow.com/questions/826319/classcastexception-when-casting-to-the-same-class

以上就是Fixing BeanNotOfRequiredTypeException on Spring proxy cast on a non-singleton bean?的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » JavaScript 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏