Hi there,
I'm looking to use Webwork2 along with Spring for a project. I'm using the xwork-spring-integration module and it's all good. All my action classes extend a BaseAction class (as most example apps seem to do) and i'm able to inject dependancies into whatever action is being used but I get a NullPointerException when trying to access the dependancies that I'm injecting into the BaseAction. I'm sure this is a common structure with the Service normally being injected into a BaseObject/Action etc.
I'm using Tomcat 4.1, btw. Here's the code:
BaseAction.java
Code:package com.affiliate.actions; import com.opensymphony.xwork.ActionSupport; import com.opensymphony.webwork.ServletActionContext; import com.affiliate.bo.UserBo; public class BaseAction extends ActionSupport{ public UserBo userBo; public String testAttribute; public String getTestAttribute(){ return testAttribute; } public void setTestAttribute(String testAttribute){ this.testAttribute = testAttribute; } public void setUserBo(UserBo userBo){ this.userBo = userBo; } public UserBo getUserBo(){ return userBo; } }
AnAction.java
Code:package com.affiliate.actions; public class AnAction extends BaseAction{ public String attribute; public void setAttribute(String attribute){ this.attribute = attribute; } public String getAttribute(){ return attribute; } public String execute(){ attribute = getUserBo().getFirstName(); return SUCCESS; } }
Next, the main applicationContext:
the xwork-related applicationContext-xwork.xml:Code:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="baseAction" class="com.affiliate.actions.BaseAction" lazy-init="false"> <property name="userBo"><ref bean="userBoBean" /></property> <property name="testAttribute"><value>Fuckerty</value></property> </bean> <bean name="userBoBean" class="com.affiliate.bo.UserBo"> <property name="firstName"> <value>Matthew</value> </property> <property name="lastName"> <value>Penrice</value> </property> </bean> </beans>
Code:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean name="anAction" class="com.affiliate.actions.AnAction" singleton="false" depends-on="baseAction"> <property name="attribute"> <value>Fuxkkushdgiuer</value> </property> </bean> </beans>
xwork.xml:
Code:<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <!-- Include webwork defaults (from WebWork-2.1 JAR). --> <include file="webwork-default.xml"/> <!-- Configuration for the default package. --> <package name="default" extends="webwork-default"> <action name="testAction" class="anAction"> <result name="success" type="velocity">success.vm</result> </action> </package> </xwork>
and finally web.xml:
Code:<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" 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"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> <!-- the spring context loader listener --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- the spring-xwork integration module --> <listener> <listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class> </listener> <servlet> <servlet-name>webwork</servlet-name> <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>webworkVelocity</servlet-name> <servlet-class>com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>webwork</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>webworkVelocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.html</welcome-file> </welcome-file-list> </web-app>
As mentioned, the it breaks down with a NullPointerException:
Code:java.lang.NullPointerException at com.affiliate.actions.AnAction.execute(AnAction.java:15) at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:283) at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:166) at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116) at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:272) at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237) at javax.servlet.http.HttpServlet.service(HttpServlet.java:809) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:534) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534)
Any help you could give would help me so much - I've read just about every Spring article and book but can't get over this **basic** hurdle.


Reply With Quote
