You are correct. You should only use @SpringBean in your wicket-related
code (components/pages). Let Spring wire the rest together, however you
want to configure it to do that (with annotations or xml). You can use
@Autowired to inject your DAOs into your Services. You just have to make
sure you set up your Spring context so that it takes care of that.
On Tue, Jun 16, 2009 at 4:36 PM, Bruce McGuire <[email protected]>
wrote:
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]