@SpringBean isn't for use inside your Spring services, just Wicket stuff. Just use the native Spring injection mechanisms. Try @Autowired.
On Wed, Dec 15, 2010 at 5:43 AM, Adam Gibbons <adam.s.gibb...@gmail.com> wrote: > Hi there, > > For some time now I have been trying to put together a simple project to get > me off the ground with a Wicket/Spring/Hibernate setup. I've had lots of ups > and downs, and found this guide really useful: > http://wicketinaction.com/2009/06/wicketspringhibernate-configuration/ > However, I still seem to be having some problems and I've no idea where to > look now. > > Here's the error I get in my log: > > org.springframework.beans.factory.BeanCreationException: Error creating bean > with name 'userServiceImpl' defined in file > [C:\tomcat6\webapps\ZenTemplate-0\WEB-INF\classes\uk\co\company\product\business\spring\UserServiceImpl.class]: > Instantiation of bean failed; nested exception is > org.springframework.beans.BeanInstantiationException: Could not instantiate > bean class [uk.co.company.product.business.spring.UserServiceImpl]: > Constructor threw exception; nested exception is org.apache.wicket.Wicket > RuntimeException: There is no application attached to current thread > ContainerBackgroundProcessor[StandardEngine[Catalina]] > 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:4135) > at > org.apache.catalina.core.StandardContext.start(StandardContext.java:4630) > 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:546) > at > org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905) > at > org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:740) > at > org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500) > at > org.apache.catalina.startup.HostConfig.check(HostConfig.java:1345) > at > org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:303) > at > org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) > at > org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1337) > at > org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601) > at > org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610) > at > org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590) > at java.lang.Thread.run(Thread.java:619) > Caused by: org.springframework.beans.BeanInstantiationException: Could not > instantiate bean class > [uk.co.company.product.business.spring.UserServiceImpl]: Constructor threw > exception; nested exception is org.apache.wicket.WicketRuntimeException: > There is no application attached to current thread > ContainerBackgroundProcessor[StandardEngine[Catalina]] > 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) > ... 32 more > Caused by: org.apache.wicket.WicketRuntimeException: There is no application > attached to current thread > ContainerBackgroundProcessor[StandardEngine[Catalina]] > at org.apache.wicket.Application.get(Application.java:181) > at > org.apache.wicket.injection.web.InjectorHolder.getInjector(InjectorHolder.java:67) > at > uk.co.company.product.business.spring.UserServiceImpl.<init>(UserServiceImpl.java:35) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > Method) > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at > org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) > ... 34 more > 15-Dec-2010 10:33:44 org.apache.catalina.core.StandardContext start > SEVERE: Error listenerStart > 15-Dec-2010 10:33:44 org.apache.catalina.core.StandardContext start > SEVERE: Context [/ZenTemplate-0] startup failed due to previous errors > 15-Dec-2010 10:33:44 org.apache.catalina.loader.WebappClassLoader > clearReferencesJdbc > SEVERE: The web application [/ZenTemplate-0] registered the JBDC driver > [com.mysql.jdbc.Driver] but failed to unregister it when the web application > was stopped. To prevent a memory leak, the JDBC Driver has been forcibly > unregistered. > 15-Dec-2010 10:33:44 org.apache.catalina.loader.WebappClassLoader > clearReferencesThreads > SEVERE: The web application [/ZenTemplate-0] appears to have started a > thread named [MySQL Statement Cancellation Timer] but has failed to stop it. > This is very likely to create a memory leak. > > web.xml: > > <?xml version="1.0" encoding="UTF-8"?> > <web-app > xmlns="http://java.sun.com/xml/ns/j2ee" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation=" > http://java.sun.com/xml/ns/j2ee > http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd > " > version="2.4" >> > <display-name>ZenTemplate</display-name> > <context-param> > <param-name>contextConfigLocation</param-name> > <param-value>classpath:applicationContext.xml</param-value> > </context-param> > <listener> > > <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> > </listener> > <filter> > <filter-name>opensessioninview</filter-name> > > <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> > </filter> > <filter> > <filter-name>wicket-spring-hibernate</filter-name> > > <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> > <init-param> > <param-name>applicationFactoryClassName</param-name> > > <param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value> > </init-param> > <init-param> > <param-name>applicationClassName</param-name> > > <param-value>uk.co.company.product.presentation.wicket.app.WicketApplication</param-value> > </init-param> > </filter> > <filter-mapping> > <filter-name>opensessioninview</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > <filter-mapping> > <filter-name>wicket-spring-hibernate</filter-name> > <url-pattern>/*</url-pattern> > </filter-mapping> > </web-app> > > applicationContext.xml: > > <?xml version="1.0" encoding="UTF-8"?> > <beans > 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 > " > default-autowire-candidates="*Service,*DAO,*Bean" > default-autowire="byType" > default-lazy-init="false" >> > <!-- <bean id="wicketApplication" > class="uk.co.company.product.presentation.wicket.app.WicketApplication" /> > --> > > <bean id="placeholderConfigurer" > class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> > <property name="ignoreUnresolvablePlaceholders" value="false" /> > <property name="systemPropertiesModeName" > value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> > <property name="ignoreResourceNotFound" value="false" /> > <property name="locations"><list> > <value>classpath*:/application.properties</value> > </list></property> > </bean> > > <bean id="dataSource" > class="org.springframework.jdbc.datasource.DriverManagerDataSource"> > <property > name="driverClassName"><value>${jdbc.driver}</value></property> > <property name="url"><value>${jdbc.url}</value></property> > <property name="username"><value>${jdbc.username}</value></property> > <property name="password"><value>${jdbc.password}</value></property> > </bean> > > <tx:annotation-driven transaction-manager="txManager" /> > > <bean id="txManager" > class="org.springframework.orm.hibernate3.HibernateTransactionManager"> > <property name="sessionFactory" ref="sessionFactory" /> > </bean> > > <!--<bean id="interceptor" > class="com.mycompany.hibernate.HibernateInterceptor"> > </bean>--> > > <bean id="sessionFactory" > class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> > <property name="dataSource" ref="dataSource" /> > <property name="hibernateProperties"> > <props> > <!-- GENERAL --> > <prop key="hibernate.dialect">${hibernate.dialect}</prop> > <prop key="hibernate.show_sql">true</prop> > <prop key="hibernate.show_sql">hibernate.format_sql</prop> > <prop key="hibernate.default_schema">zen_template</prop> > <prop key="hibernate.max_fetch_depth">2</prop> > <!-- <prop > key="hibernate.default_batch_fetch_size">16</prop> --> > <prop key="hibernate.default_entity_mode">pojo</prop> > <prop key="hibernate.order_updates">true</prop> > <prop key="hibernate.generate_statistics">true</prop> > <prop key="hibernate.use_identifier_rollback">true</prop> > <prop > key="hibernate.current_session_context_class">thread</prop> > <prop key="hibernate.use_outer_join">true</prop> > <!-- JDBC --> > <!-- <prop key="hibernate.jdbc.batch_size">20</prop> --> > <!-- <prop > key="hibernate.jdbc.batch_versioned_data">true</prop> --> > <prop > key="hibernate.jdbc.use_streams_for_binary">true</prop> > <prop > key="hibernate.jdbc.use_get_generated_keys">true</prop> > <!-- CONNECTION --> > <prop key="hibernate.connection.isolation">8</prop><!-- > TRANSACTION_SERIALIZABLE --> > <prop key="hibernate.connection.autocommit">false</prop> > <prop key="hibernate.connection.pool_size">5</prop> > <!-- CACHE --> > <!-- <prop > key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> > --> > <!-- <prop > key="hibernate.cache.use_minimal_puts">true</prop> --> > <!-- <prop key="hibernate.cache.use_query_cache">true</prop> > --> > <!-- MISCELLANEOUS --> > <prop > key="hibernate.bytecode.use_reflection_optimizer">true</prop> > <prop > key="hibernate.cglib.use_reflection_optimizer">true</prop> > <!-- <prop key="hibernate.bytecode.provider">cglib</prop> > --> > <!-- <prop key="hibernate.query.substitutions">true</prop> > --> > </props> > </property> > <!--<property name="entityInterceptor"> > <ref bean="interceptor" /> > </property>--> > <property name="packagesToScan"><list> > <value>uk.co.company.product.persistance.hibernate</value> > </list></property> > </bean> > <context:component-scan base-package="uk.co.company.product" /> > </beans> > > my WicketApplication.java: > > public class WicketApplication extends AuthenticatedWebApplication{ > > public WicketApplication(){ > super(); > } > > �...@override > final public Class<HomePage> getHomePage(){ > return HomePage.class; > } > > �...@override > final protected Class<? extends WebPage> getSignInPageClass(){ > return LoginPage.class; > } > > �...@override > final protected Class<? extends AuthenticatedWebSession> > getWebSessionClass() { > return CustomAuthenticatedWebSession.class; > } > > �...@override > final protected void init(){ > super.init(); > addComponentInstantiationListener(new > SpringComponentInjector(this)); > final IApplicationSettings appSettings = getApplicationSettings(); > appSettings.setAccessDeniedPage(CustomAccessDeniedPage.class); > //appSettings.setPageExpiredErrorPage(null); > //appSettings.setInternalErrorPage(null); > } > } > > my CustomAuthenticatedWebSession: > > public class CustomAuthenticatedWebSession extends AuthenticatedWebSession{ > private static final long serialVersionUID = 4713195500103052768L; > > �...@springbean > private UserService userService; > public void setUserService(final UserService userService){ > this.userService = userService; > } > > transient private String currentUser = null; > > public CustomAuthenticatedWebSession(final Request request){ > super(request); > InjectorHolder.getInjector().inject(this);//<-- VERY IMPORTANT to > get Spring DI to work. > } > > �...@override > public boolean authenticate(final String username, final String > password){ > currentUser = username; > return userService.authenticate(username, password); > } > > �...@override > public Roles getRoles(){ > return userService.getRoles(currentUser, isSignedIn()); > } > } > > > my UserServiceImpl.java: > > @Service > public class UserServiceImpl extends _AbstractService implements > UserService{ > > final private TestUserService testUserService = new TestUserService(); > > �...@springbean > private Temp1DAO temp1DAO; > /* (non-Javadoc) > * @see > uk.co.company.product.business.spring.UserService#setTemp1DAO(uk.co.company.product.persistance.hibernate.Temp1DAO) > */ > �...@override > �...@required > final public void setTemp1DAO(final Temp1DAO temp1dao){ > temp1DAO = temp1dao; > } > > public UserServiceImpl(){ > super(); > InjectorHolder.getInjector().inject(this);//<-- VERY IMPORTANT to > get Spring DI to work. > } > > /* (non-Javadoc) > * @see > uk.co.company.product.business.spring.UserService#authenticate(java.lang.String, > java.lang.String) > */ > �...@override > �...@transactional > final public boolean authenticate(final String userName, final String > password){ > final Temp1 temp1 = new Temp1(); > temp1.setValue(userName); > temp1DAO.save(temp1); > return testUserService.authenticate(userName, password); > } > > /* (non-Javadoc) > * @see > uk.co.company.product.business.spring.UserService#getRoles(java.lang.String, > boolean) > */ > �...@override > �...@transactional > final public Roles getRoles(final String userName, final boolean > signedIn){ > return testUserService.getRoles(userName, signedIn); > } > } > > and finally Temp1DAOImpl.java: > > @Repository > public class Temp1DAOImpl extends AbstractTemp1DAO implements Temp1DAO{ > private static final Log log = LogFactory.getLog(Temp1DAOImpl.class); > > public Temp1DAOImpl(){ > super(); > log.debug("Temp1DAO created."); > } > } > > I did have this working to the point where it would start up without errors, > although it would die when trying to call userServiceImpl.authenticate() due > to a NPE for temp1DAO. (It seemed odd before that it would do DI for > Services but not for DAOs...) > I'm sure I'm missing something blindingly obvious, but I'd really appriciate > a second opinion. > > Thanks in advance for all help and assistance!! > > > Cheers, > Adam > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org