Results 1 to 5 of 5

Thread: AbstractWizardFormController in portlet problem

  1. #1
    Join Date
    Nov 2006
    Posts
    16

    Default AbstractWizardFormController in portlet problem

    Hi

    I've hit a problem using the AbstractWizardFormController (AddClaimLineController) within a portlet when returning from a processCancel method.

    My processCancelMethod looks like this:

    Code:
    protected void processCancel(ActionRequest request, ActionResponse response, Object command, BindException errors)
    			throws Exception {
    		logger.debug("in processCancel");
    		response.setRenderParameter("action", "editClaim");
    
    	}
    This has the effect of returning the request back to a SimpleFormController. However in a SimpleFormController the formBackingObject method is not invoked.
    Instead flow returns directly to onSubmitRender:

    Code:
    2009-01-19 12:44:21,927 DEBUG [AddClaimLineController] - in processCancel
    2009-01-19 12:44:21,943 DEBUG [EditClaimController] - onSubmitRender enter
    It seems to me that Spring MVC is trying to inject the object from the Wizard controller back into the SimpleFormController.

    My portlet config file:

    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 id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
          <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix">
          <value>/WEB-INF/jsp/MakeClaim/</value>
        </property>
        <property name="suffix">
          <value>.jsp</value>
        </property>
      </bean>
      
      <bean id="homePageController"
        class="test.onlineexpenses.controller.HomePageController">
        <property name="expenseClaimService" ref="expenseClaimService"></property>
      </bean>
      
      <bean id="editClaimController"
        class="test.onlineexpenses.controller.EditClaimController">
        <property name="expenseClaimService" ref="expenseClaimService"></property>
        <property name="commandName" value="claim" />
        <property name="commandClass" value="test.onlineexpenses.domain.ExpenseClaim" />
        <property name="formView" value="editClaim"></property>
        <property name="successView" value="editClaim"></property>
      </bean>
      
      <bean id="addClaimLineController"
        class="test.onlineexpenses.controller.AddClaimLineController">
        <property name="expenseClaimService" ref="expenseClaimService"></property>
        <property name="commandName" value="claimLine" />
        <property name="commandClass" value="test.onlineexpenses.domain.ClaimLine" />
      </bean>
      
      <bean id="parameterMappingInterceptor"
        class="org.springframework.web.portlet.handler.ParameterMappingInterceptor" />
      
      <bean id="portletModeParameterHandlerMapping"
        class="org.springframework.web.portlet.handler.PortletModeParameterHandlerMapping">
        <property name="order" value="1" />
        <property name="interceptors">
          <list>
            <ref bean="parameterMappingInterceptor" />
          </list>
        </property>
        <property name="portletModeParameterMap">
          <map>
            <entry key="view">
              <map>
                <entry key="homePage">
                  <ref bean="homePageController" />
                </entry>
                <entry key="editClaim">
                  <ref bean="editClaimController" />
                </entry>
                <entry key="addClaimLine">
                  <ref bean="addClaimLineController" />
                </entry>
              </map>
            </entry>
          </map>
        </property>
      </bean>
      <bean id="portletModeHandlerMapping"
        class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
        <property name="order" value="2" />
        <property name="portletModeMap">
          <map>
            <entry key="view">
              <ref bean="homePageController" />
            </entry>
          </map>
        </property>
      </bean>
      
      
      
      <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
          <list>
            <value>test.onlineexpenses.nl.MakeExpenseClaimPortletResource</value>
          </list>
        </property>
      </bean>
    </beans>
    The error I'm seeing is:

    Code:
    [19/01/09 15:21:07:679 GMT] 0000003f JstlView      1 org.springframework.web.servlet.view.AbstractView exposeModelAsRequestAttributes Added model object 'org.springframework.validation.BindingResult.claimLine' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'editClaim'
    [19/01/09 15:21:07:679 GMT] 0000003f JstlView      1 org.springframework.web.servlet.view.AbstractView exposeModelAsRequestAttributes Added model object 'claimLine' of type [test.onlineexpenses.domain.ClaimLine] to request in view with name 'editClaim'
    [19/01/09 15:21:07:679 GMT] 0000003f JstlView      1 org.springframework.web.servlet.view.InternalResourceView renderMergedOutputModel Including resource [/WEB-INF/jsp/MakeClaim/editClaim.jsp] in InternalResourceView 'editClaim'
    [19/01/09 15:21:07:679 GMT] 0000003f InputTag      E org.springframework.web.servlet.tags.RequestContextAwareTag doStartTag Neither BindingResult nor plain target object for bean name 'claim' available as request attribute
      at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)

    It seems to me that spring is using the command object from the AbstractWizardFormController inside the SimpleFormController, when it should be using a separate command object for the SimpleFormController.

    Source code attached...
    AddClaimLineController.txt
    EditClaimController.txt

    Anyone see what's going wrong?

    Last edited by tc1; Jan 19th, 2009 at 12:10 PM. Reason: added code...

  2. #2
    Join Date
    Sep 2004
    Location
    Arizona, USA
    Posts
    383

    Default

    That's happening because the 'isFormSubmission' method for the SimpleFormController is returning true, since the Cancel is technically a form submission. This is happening because of some render parameters used for signaling purposes between the action and render phases of AbstractFormController (ancestor to both AbstractWizardFormController and SimpleFormController).

    To clear this up, just use the ActionResponse.setRenderParameters(java.util.Map parameters) method so that you can simulataneously clear all the existing render parameters and set the one you need for navigation purposes.

  3. #3
    Join Date
    Nov 2006
    Posts
    16

    Default New error:Value must not be null

    Hey

    Thanks very much for your suggestion and your explanation of why the problem is happening.

    I tried to implement your suggestion (please see code below):

    Code:
    protected void processCancel(ActionRequest request, ActionResponse response, Object command, BindException errors)
    			throws Exception {
    		logger.debug("in processCancel");
    		Map params = new HashMap();
    		params.put("action","editClaim");
    		response.setRenderParameters(params);
    
    	}

    However I'm now getting a new error:

    Code:
    [20/01/09 16:50:48:278 GMT] 0000005c DispatcherPor 1 org.springframework.web.portlet.DispatcherPortlet doActionService Caught exception during action phase - forwarding to render phase
                                     java.lang.IllegalArgumentException: Value must not be null and of type java.lang.String[].
      at org.apache.pluto.util.StringUtils.copyParameters(StringUtils.java:106)
      at org.apache.pluto.core.impl.ActionResponseImpl.setRenderParameters(ActionResponseImpl.java:178)
      at org.apache.pluto.portlet.ActionResponseWrapper.setRenderParameters(ActionResponseWrapper.java:100)
      at test.onlineexpenses.controller.AddClaimLineController.processCancel(AddClaimLineController.java:54)
      at org.springframework.web.portlet.mvc.AbstractWizardFormController.processFormSubmission(AbstractWizardFormController.java:651)
      at org.springframework.web.portlet.mvc.AbstractFormController.handleActionRequestInternal(AbstractFormController.java:390)
      at org.springframework.web.portlet.mvc.AbstractController.handleActionRequest(AbstractController.java:196)
      at org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter.handleAction(SimpleControllerHandlerAdapter.java:46)
      at org.springframework.web.portlet.DispatcherPortlet.doActionService(DispatcherPortlet.java:694)
      at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:480)
      at org.springframework.web.portlet.FrameworkPortlet.processAction(FrameworkPortlet.java:462)
      at com.ibm.wps.pe.pc.std.cmpf.impl.PortletFilterChainImpl.processAction(PortletFilterChainImpl.java:104)
    The portlet is running on IBM Websphere Portal 6, using Spring 2.5.6

    Should I be setting other parameters in the Map?

    Once again, thanks for all your help.

  4. #4
    Join Date
    Sep 2004
    Location
    Arizona, USA
    Posts
    383

    Default

    No -- sounds like the objects in the Map aren't being interpreted as Strings, probably because the 'put' method signature will take Object. Try explicitly making the two values into Strings.

  5. #5
    Join Date
    Nov 2006
    Posts
    16

    Default Sorted thanks!

    Result!

    I've sorted the problem thanks. I should have read the Java API docs for ActionResponse.setRenderParamaters which says that:

    "parameters - Map containing parameter names for the render phase as keys and parameter values as map values. The keys in the parameter map must be of type String. The values in the parameter map must be of type String array (String[]).


    So my code now looks like this, and it works:
    Code:
    params.put("action",new String[]{"editClaim"});
    Thanks for your help

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •