@SpringBean only works with Components. For all other uses you should either call InjectorHolder.getInjector().inject(this) in your constructor or use Salve.
Martijn On Tue, Jun 16, 2009 at 9:26 PM, Bruce McGuire<[email protected]> wrote: > Hello. > > I have created a new small project to try to figure out how to use the > SpringBean, Service, and Repository annotations with Wicket, Spring, > Hibernate, Maven and Eclipse. > > However, I am getting an error with a user DAO that I have created. > > I have a service that is using the dao tagged as @Service, I have the DAO in > the service tagged with @SpringBean, and the DAO code itself is tagged with > @Repository. The service that is using the DAO is getting found correctly. > > When I have the InjectorHolder code in the dao constructor, I get an error > that says 'InjectorHolder has not been assigned an injector' > > When I comment out the InjectorHolder line in the dao constructor, the DAO > is null, and getUserDAO throws an exception. > > Since I am not certain that I can attach files, I will insert the relevant > code and exceptions into this email. > > Any pointers you can give would be greatly appreciated. > > Thanks very very much, > > Bruce. > > UserServiceImpl > ========================= > @Service("UserService") > public class UserServiceImpl implements UserService > { > @SpringBean > UserDAO userDAO ; > > private UserDAO getUserDAO() > { > if (null == userDAO) > { > throw new RuntimeException("userDAO is null") ; > } > > return(userDAO) ; > } > > @Override > public List<User> getUsers() > { > return (getUserDAO().findAll()); > } > ========================= > > UserDAOHibernate > ========================= > @Repository("UserDAO") > public class UserDAOHibernate extends GenericDAOHibernate<User, String> > implements UserDAO > { > private static Log log = LogFactory.getLog("UserDAOHibernate"); > > public UserDAOHibernate() > { > InjectorHolder.getInjector().inject(this); > } > > ... > ========================= > > HomePage > ========================= > public class HomePage extends WebPage > { > @SpringBean > private UserService userService ; > > public HomePage(final PageParameters parameters) > { > super (parameters) ; > > List<User> userList = userService.getUsers() ; > > RepeatingView rv = new RepeatingView("Users") ; > for(User user: userList) > { > Label userName = new Label("username", user.getUsername()) ; > rv.add(userName) ; > } > > this.add(rv) ; > } > } > ========================= > > CoastwareApplication > ========================= > public class CoastwareApplication extends WebApplication > { > private ApplicationContext ctx; > > @SpringBean > private UserService userService ; > > protected static Log log = LogFactory.getLog(CoastwareApplication.class) ; > > private static ISpringContextLocator CTX_LOCATOR = new > ISpringContextLocator() > { > public ApplicationContext getSpringContext() > { > return(CoastwareApplication.get().ctx) ; > } > } ; > > public CoastwareApplication() > { > } > > public void init() > { > ctx = new ClassPathXmlApplicationContext("appContext.xml") ; > > addComponentInstantiationListener(new SpringComponentInjector(this)); > > super.init() ; > } > > @Override > public Session newSession(Request request, Response response) > { > return (new WebSession(request)) ; > } > > public static CoastwareApplication get() > { > return ((CoastwareApplication) Application.get()) ; > } > > private <T> T createProxy(Class<T> clazz) > { > return ((T) LazyInitProxyFactory.createProxy(clazz, new > SpringBeanLocator(clazz, CTX_LOCATOR))) ; > } > > public Class<HomePage> getHomePage() > { > return HomePage.class; > } > > public UserService getUserService() > { > if (null == userService) > { > userService = createProxy(UserService.class) ; > } > return userService; > } > } > ========================= > > > Web.xml > ========================= > <display-name>vProbe</display-name> > > <context-param> > <param-name>contextConfigLocation</param-name> > <param-value>classpath:appContext.xml</param-value> > </context-param> > > <context-param> > <param-name>configuration</param-name> > <param-value>development</param-value> > </context-param> > > <listener> > <listener-class> > org.springframework.web.context.ContextLoaderListener > </listener-class> > </listener> > > <filter> > <filter-name>wicketFilter</filter-name> > > <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> > <init-param> > <param-name>applicationClassName</param-name> > > <param-value>com.coastware.vProbe.CoastwareApplication</param-value> > </init-param> > </filter> > > <filter> > <filter-name>opensessioninview</filter-name> > > <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> > </filter> > > <filter-mapping> > <filter-name>wicketFilter</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > > <filter-mapping> > <filter-name>opensessioninview</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > ========================= > > appContext.xml > ========================= > <?xml version="1.0" encoding="UTF-8"?> > <beans > default-autowire="autodetect" > xmlns="http://www.springframework.org/schema/beans" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xmlns:aop="http://www.springframework.org/schema/aop" > xmlns:tx="http://www.springframework.org/schema/tx" > xmlns:context="http://www.springframework.org/schema/context" > xsi:schemaLocation=" > http://www.springframework.org/schema/beans > http://www.springframework.org/schema/beans/spring-beans-2.5.xsd > http://www.springframework.org/schema/aop > http://www.springframework.org/schema/aop/spring-aop-2.5.xsd > http://www.springframework.org/schema/tx > http://www.springframework.org/schema/tx/spring-tx-2.5.xsd > http://www.springframework.org/schema/context > http://www.springframework.org/schema/context/spring-context-2.5.xsd"> > > <bean id="dataSource" > class="org.springframework.jdbc.datasource.DriverManagerDataSource"> > <property name="url" value="jdbc:mysql://192.168.15.128/vprobe"/> > <property name="driverClassName" value="com.mysql.jdbc.Driver"/> > <property name="username" value="vProbe"/> > <property name="password" value="vProbe"/> > </bean> > > <bean id="sessionFactory" > class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> > <property name="dataSource" ref="dataSource"/> > > <property name="packagesToScan"> > <list> > <value>com.coastware.vProbe.model</value> > </list> > </property> > > <property name="hibernateProperties"> > <props> > <prop > key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> > <prop key="hibernate.show_sql">true</prop> > <prop key="hibernate.format_sql">true</prop> > <prop key="hibernate.use_sql_comments">true</prop> > </props> > </property> > </bean> > > <context:component-scan base-package="com.coastware" /> > > <bean id="openSessionInViewInterceptor" > class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> > <property name="sessionFactory"> > <ref bean="sessionFactory"/> > </property> > </bean> > > <bean id="transactionManager" > class="org.springframework.orm.hibernate3.HibernateTransactionManager"> > <property name="sessionFactory"> > <ref bean="sessionFactory"/> > </property> > </bean> > > <bean id="hibernateTemplate" > class="org.springframework.orm.hibernate3.HibernateTemplate"> > <property name="sessionFactory"> > <ref bean="sessionFactory"/> > </property> > </bean> > > <tx:annotation-driven transaction-manager="transactionManager"/> > > <bean > class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> > > <bean > class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> > <property name="transactionInterceptor" ref="txInterceptor"/> > </bean> > > <bean id="txInterceptor" > class="org.springframework.transaction.interceptor.TransactionInterceptor"> > <property name="transactionManager" ref="transactionManager"/> > <property name="transactionAttributeSource"> > <bean > class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/> > </property> > </bean> > </beans> > ========================= > > > Error with InjectorHolder line > ========================= > SEVERE: Exception sending context initialized event to listener instance of > class org.springframework.web.context.ContextLoaderListener > org.springframework.beans.factory.BeanCreationException: Error creating bean > with name 'UserDAO' defined in file [C:\Program Files\Apache Software > Foundation\Tomcat > 6.0\webapps\vProbe\WEB-INF\classes\com\coastware\vProbe\model\dao\hibernate\UserDAOHibernate.class]: > Instantiation of bean failed; nested exception is > org.springframework.beans.BeanInstantiationException: Could not instantiate > bean class [com.coastware.vProbe.model.dao.hibernate.UserDAOHibernate]: > Constructor threw exception; nested exception is > java.lang.IllegalStateException: InjectorHolder has not been assigned an > injector. Use InjectorHolder.setInjector() to assign an injector. In most > cases this should be done once inside SpringWebApplication subclass's init() > method. > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:883) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) > at java.security.AccessController.doPrivileged(Native Method) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) > at > org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) > at > org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) > at > org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) > at > org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) > at > org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) > at > org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) > at > org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) > at > org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843) > at > org.apache.catalina.core.StandardContext.start(StandardContext.java:4342) > at > org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) > at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) > at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525) > at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:830) > at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:719) > at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490) > at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149) > at > org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) > at > org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) > at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) > at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) > at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) > at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) > at > org.apache.catalina.core.StandardService.start(StandardService.java:516) > at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) > at org.apache.catalina.startup.Catalina.start(Catalina.java:578) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) > at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) > Caused by: org.springframework.beans.BeanInstantiationException: Could not > instantiate bean class > [com.coastware.vProbe.model.dao.hibernate.UserDAOHibernate]: Constructor > threw exception; nested exception is java.lang.IllegalStateException: > InjectorHolder has not been assigned an injector. Use > InjectorHolder.setInjector() to assign an injector. In most cases this > should be done once inside SpringWebApplication subclass's init() method. > at > org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115) > at > org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877) > ... 40 more > Caused by: java.lang.IllegalStateException: InjectorHolder has not been > assigned an injector. Use InjectorHolder.setInjector() to assign an > injector. In most cases this should be done once inside SpringWebApplication > subclass's init() method. > at > org.apache.wicket.injection.web.InjectorHolder.getInjector(InjectorHolder.java:64) > at > com.coastware.vProbe.model.dao.hibernate.UserDAOHibernate.<init>(UserDAOHibernate.java:26) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) > at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) > at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown > Source) > at java.lang.reflect.Constructor.newInstance(Unknown Source) > at > org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) > ... 42 more > ========================= > > Error when InjectorHolder line is commented out. > ========================= > > java.lang.RuntimeException: userDAO is null at > com.coastware.vProbe.service.UserServiceImpl.getUserDAO(UserServiceImpl.java:90) > at > com.coastware.vProbe.service.UserServiceImpl.getUsers(UserServiceImpl.java:68) > at java.lang.reflect.Method.invoke(Unknown Source) at > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198) > at $Proxy15.getUsers(Unknown Source) at > java.lang.reflect.Method.invoke(Unknown Source) at > org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:416) > at org.apache.wicket.proxy.$Proxy16.getUsers(Unknown Source) at > com.coastware.vProbe.HomePage.<init>(HomePage.java:27) at > java.lang.reflect.Constructor.newInstance(Unknown Source) at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:147) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:272) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:293) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:210) > at > org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91) > at > org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1220) > at org.apache.wicket.RequestCycle.step(RequestCycle.java:1297) at > org.apache.wicket.RequestCycle.steps(RequestCycle.java:1399) at > org.apache.wicket.RequestCycle.request(RequestCycle.java:529) at > org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356) at > org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:201) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) > at > org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857) > at > org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565) > at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509) > at java.lang.Thread.run(Unknown Source) > > Complete stack: > > org.apache.wicket.WicketRuntimeException: Can't instantiate page using > constructor public > com.coastware.vProbe.HomePage(org.apache.wicket.PageParameters) and argument > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:168) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:272) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:293) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:210) > at > org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91) > at > org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1220) > at org.apache.wicket.RequestCycle.step(RequestCycle.java:1297) at > org.apache.wicket.RequestCycle.steps(RequestCycle.java:1399) at > org.apache.wicket.RequestCycle.request(RequestCycle.java:529) at > org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356) > > java.lang.reflect.InvocationTargetException at > sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at > sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at > java.lang.reflect.Constructor.newInstance(Unknown Source) at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:147) > at > org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:272) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:293) > at > org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:210) > at > org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:91) > at > org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1220) > at org.apache.wicket.RequestCycle.step(RequestCycle.java:1297) at > org.apache.wicket.RequestCycle.steps(RequestCycle.java:1399) at > org.apache.wicket.RequestCycle.request(RequestCycle.java:529) at > org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:356) > > ========================= > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > > -- Become a Wicket expert, learn from the best: http://wicketinaction.com Apache Wicket 1.3.5 is released Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3. --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
