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

Reply via email to