Hello,

I'm using tomcat4/milestone 4 (Struts nightly build from 06-Dec)


the exception I'm getting:

A Servlet Exception Has Occurred
Exception Report:
javax.servlet.ServletException: Servlet.service() for servlet default threw
exception
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
java:537)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher
.java:292)
        at
org.apache.struts.action.ActionServlet.processValidate(ActionServlet.java:17
69)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1321)
        at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:447)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
java:517)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher
.java:292)
        at
org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.ja
va:1468)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1334)
        at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:447)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:180)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:255)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:165)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:1876)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161
)
        at
org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
        at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:343)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:159)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
785)
        at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:902)
        at java.lang.Thread.run(Thread.java:484)
Root Cause:
java.lang.NullPointerException
        at
org.apache.catalina.resources.FileResources.setResource(FileResources.java:5
86)
        at
org.apache.catalina.servlets.DefaultServlet.doPut(DefaultServlet.java:401)
        at
org.apache.catalina.servlets.DefaultServlet.doPost(DefaultServlet.java:365)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
java:517)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher
.java:292)
        at
org.apache.struts.action.ActionServlet.processValidate(ActionServlet.java:17
69)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1321)
        at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:447)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
java:517)
        at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher
.java:292)
        at
org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.ja
va:1468)
        at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1334)
        at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:447)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:180)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:255)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:165)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.core.StandardContext.invoke(StandardContext.java:1876)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161
)
        at
org.apache.catalina.valves.ValveBase.invokeNext(ValveBase.java:242)
        at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:343)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:975)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:159)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:977)
        at
org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
785)
        at
org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:902)
        at java.lang.Thread.run(Thread.java:484)


----------------------------------------------------------------------------
----------------------------------------------------------------------------
-----

As for the synchronization problem :

  // current code from the ActionServlet

   protected Action processActionCreate(ActionMapping mapping,
                                         HttpServletRequest request) {

        // Acquire the Action instance we will be using
        String actionClass = mapping.getType();
        Action actionInstance = (Action) actions.get(actionClass);     
        if (actionInstance == null) {
(<---******)
            try {
                Class clazz = Class.forName(actionClass);

                actionInstance = (Action) clazz.newInstance();
                actionInstance.setServlet(this);
                actions.put(actionClass, actionInstance);
(<---******)
 

What if (let's say) thread1 is in the try-block, but has not yet completed
the try-block;
and an other thread tries to access the same action and also passes the
if-statement, since thread1 has not
yet set the new "actionInstance" in the hashtable. 

This would lead of having (for a specific time intervall and under specific
circumstances) multiple Instances
of an (specific :) Action.


fm

Reply via email to