Hello James.
So I have completely missed the point of the Repository, Service and
SpringBean annotations? I was under the impression that the idea was to
avoid using a lot of xml in my context files.
If I am understanding correctly, what you and Martijn are saying is the
following:
Tag the dao and service classes with Repository and Service, and in
wicket code, tag any use of them with SpringBean. However, in the
service classes, use the normal xml injection method and get/set to get
the dao into the service class.
Is this a correct interpretation?
Thanks,
Bruce.
James Carman wrote:
You shouldn't use @SpringBean in your spring-managed beans, only in
your Wicket code. You don't want view-specific code in your "domain"
code.
On Tue, Jun 16, 2009 at 4:17 PM, Bruce McGuire <[email protected]> wrote:
Hi Martijn.
Thanks for the quick response.
Are you saying that the dao and the service should have the InjectorHolder
code, rather than the @Repository and @Service tags?
Bruce.
Martijn Dashorst wrote:
@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 =erDAO)
{
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 =Factory.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 =rService.getUsers() ;
RepeatingView rv = RepeatingView("Users") ;
for(User user: userList)
{
Label userName = 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 =Factory.getLog(CoastwareApplication.class) ;
private static ISpringContextLocator CTX_LOCATOR =
ISpringContextLocator()
{
public ApplicationContext getSpringContext()
{
return(CoastwareApplication.get().ctx) ;
}
} ;
public CoastwareApplication()
{
}
public void init()
{
ctx = 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 =erService)
{
userService =ateProxy(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=odetect"
xmlns=p://www.springframework.org/schema/beans"
xmlns:xsi=p://www.w3.org/2001/XMLSchema-instance"
xmlns:aop=p://www.springframework.org/schema/aop"
xmlns:tx=p://www.springframework.org/schema/tx"
xmlns:context=p://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=aSource"
class=.springframework.jdbc.datasource.DriverManagerDataSource">
<property name=" value="jdbc:mysql://192.168.15.128/vprobe"/>
<property name=verClassName" value="com.mysql.jdbc.Driver"/>
<property name=rname" value="vProbe"/>
<property name=sword" value="vProbe"/>
</bean>
<bean id=sionFactory"
class=.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name=aSource" ref="dataSource"/>
<property name¬kagesToScan">
<list>
<value>com.coastware.vProbe.model</value>
</list>
</property>
<property name=ernateProperties">
<props>
<prop
key=ernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key=ernate.show_sql">true</prop>
<prop key=ernate.format_sql">true</prop>
<prop key=ernate.use_sql_comments">true</prop>
</props>
</property>
</bean>
<context:component-scan base-package=.coastware" />
<bean id=nSessionInViewInterceptor"
class=.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name=sionFactory">
<ref bean=sionFactory"/>
</property>
</bean>
<bean id=nsactionManager"
class=.springframework.orm.hibernate3.HibernateTransactionManager">
<property name=sionFactory">
<ref bean=sionFactory"/>
</property>
</bean>
<bean id=ernateTemplate"
class=.springframework.orm.hibernate3.HibernateTemplate">
<property name=sionFactory">
<ref bean=sionFactory"/>
</property>
</bean>
<tx:annotation-driven transaction-manager=nsactionManager"/>
<bean
class=.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<bean
class=.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name=nsactionInterceptor" ref="txInterceptor"/>
</bean>
<bean id=nterceptor"
class=.springframework.transaction.interceptor.TransactionInterceptor">
<property name=nsactionManager" ref="transactionManager"/>
<property name=nsactionAttributeSource">
<bean
class=.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]