Results 1 to 8 of 8

Thread: Problem in MultiActionController

  1. #1

    Default Problem in MultiActionController

    I am trying to use MultiActionController first time. I had a user signup form where i have two buttons one is submit and one is cancel. onclick of submit my data get's inserted into database after validation checks and i want onclick of cancel my parent form i.e. login screen should apprear. If i use simple form controller i can't code cancel button so i try to change my sontroller to multication controller. My Controller is as follows:

    Code:
    package com.sachin.login;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.*;
    import com.sachin.login.SignIn;
    import org.springframework.validation.BindException;
    //import org.springframework.web.servlet.mvc.SimpleFormController;
    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
    import org.springframework.web.servlet.ModelAndView;
    
    public class SignUpController extends MultiActionController{
    
    	private SignInDAO signInDao;
    
    //checks if a user with same id exists in database
    
    	public void onBindAndValidate(
                HttpServletRequest request,
                Object command,
                BindException errors) throws Exception{
    
    		if (errors.hasErrors())return;
    		SignIn formEmployee = (SignIn) command;
    		 SignIn dbEmployee = (SignIn) command;
    	        if ((dbEmployee=signInDao.getCredExist(formEmployee)) != null)
    	            errors.reject("error.login.exist.invalid");
    
    	}
    
    //should be called on click of button from view where button name is "Submit"
    
    	public ModelAndView Submit(HttpServletRequest request,
    			HttpServletResponse response,Object command) {
    		SignIn data = (SignIn) command;
    		signInDao.saveDataSheet(data);
    		return new ModelAndView("successsignup");
    	}
    
    //should be called on click of button from view where button name is "Cancel"
    	public ModelAndView Cancel(HttpServletRequest request,
    			HttpServletResponse response) {
    		return new ModelAndView("signIn");
    	}
    
    	public SignInDAO getSignInDao() {
    		return signInDao;
    	}
    
    	public void setSignInDao(SignInDAO signInDao) {
    		this.signInDao = signInDao;
    	}
    
    }
    my configuration file os:

    login-servlet.xml

    Code:
    <beans>
    	<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
    		    <prop key="/signIn.htm">signInController</prop>
    		    <prop key="/signupform.htm">signUpController</prop>
                </props>
            </property>
        </bean>
    
            <!-- Validator -->
            <bean id="signUpValidator" class="com.sachin.login.SignUpValidator"/>
          
          <!-- Controller-->
    
         <bean id="signUpController" class="com.sachin.login.SignUpController">
    	<property name="sessionForm"><value>true</value></property>
    	<property name="commandName"><value>SignIn</value></property>
    	<property name="commandClass"><value>com.sachin.login.SignIn</value></property>
    	<property name="validateOnBinding"><value>true</value></property>
    	<property name="validator"><ref bean="signUpValidator"/></property>
    	<property name="formView"><value>signupform</value></property>
    	<property name="successView"><value>successsignup</value></property>
    	<property name="bindOnNewForm"><value>false</value></property>
    	<property name="signInDao"><ref bean="signInDao" /></property>
    	<property name="methodNameResolver"><ref bean="methodNameResolver"/></property>
    	</bean>
    
    	<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
    	<property name="paramName">
    	<value>action</value>
    	</property>
    	</bean>

    now when i try to run this i got the following error :

    Code:
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'signUpController' defined in ServletContext resource [/WEB-INF/login-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionForm' of bean class [com.sachin.login.SignUpController]: Bean property 'sessionForm' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:870)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:624)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:411)
    	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
    	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:642)
    	org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:194)
    	org.springframework.web.servlet.handler.SimpleUrlHandlerMapping.initApplicationContext(SimpleUrlHandlerMapping.java:98)
    	org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)
    	org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:86)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:287)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:920)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:415)
    	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
    	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:304)
    	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
    	org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:156)
    	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:308)
    	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:252)
    	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:221)
    	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:115)
    	javax.servlet.GenericServlet.init(GenericServlet.java:211)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    	org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	java.lang.Thread.run(Unknown Source)
    if i use this in the controller then my application loads fine :

    Code:
     <bean id="signUpController" class="com.sachin.login.SignUpController">
    	<property name="methodNameResolver"><ref bean="methodNameResolver"/></property>
    	</bean>
    but now i have no way to inject validator or command class, hence error whhile submitting the form. Please suggest....

  2. #2

    Default try by removing session property

    <bean id="signUpController" class="com.sachin.login.SignUpController">
    <property name="sessionForm"><value>true</value></property>
    <property name="commandName"><value>SignIn</value></property>
    <property name="commandClass"><value>com.sachin.login.SignIn </value></property>
    <property name="validateOnBinding"><value>true</value></property>
    <property name="validator"><ref bean="signUpValidator"/></property>
    <property name="formView"><value>signupform</value></property>
    <property name="successView"><value>successsignup</value></property>
    <property name="bindOnNewForm"><value>false</value></property>
    <property name="signInDao"><ref bean="signInDao" /></property>
    <property name="methodNameResolver"><ref bean="methodNameResolver"/></property>
    </bean>




    remove session property from above bean tag.(<property name="sessionForm"><value>true</value></property>)
    Success, a ongoing journey !

  3. #3

    Default

    Quote Originally Posted by ArunD View Post
    <bean id="signUpController" class="com.sachin.login.SignUpController">
    <property name="sessionForm"><value>true</value></property>
    <property name="commandName"><value>SignIn</value></property>
    <property name="commandClass"><value>com.sachin.login.SignIn </value></property>
    <property name="validateOnBinding"><value>true</value></property>
    <property name="validator"><ref bean="signUpValidator"/></property>
    <property name="formView"><value>signupform</value></property>
    <property name="successView"><value>successsignup</value></property>
    <property name="bindOnNewForm"><value>false</value></property>
    <property name="signInDao"><ref bean="signInDao" /></property>
    <property name="methodNameResolver"><ref bean="methodNameResolver"/></property>
    </bean>




    remove session property from above bean tag.(<property name="sessionForm"><value>true</value></property>)

    I did it now the error is:

    Code:
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'signUpController' defined in ServletContext resource [/WEB-INF/login-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'commandName' of bean class [com.sachin.login.SignUpController]: Bean property 'commandName' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:870)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:624)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:411)
    	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
    	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:642)
    	org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:194)
    	org.springframework.web.servlet.handler.SimpleUrlHandlerMapping.initApplicationContext(SimpleUrlHandlerMapping.java:98)
    	org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)
    	org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:86)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:287)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:920)
    	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:415)
    	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
    	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:141)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
    	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:156)
    	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:304)
    	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
    	org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:156)
    	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:308)
    	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:252)
    	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:221)
    	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:115)
    	javax.servlet.GenericServlet.init(GenericServlet.java:211)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    	org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    	org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	java.lang.Thread.run(Unknown Source)
    and this keeps coming until i do this:
    Code:
    <bean id="signUpController" class="com.sachin.login.SignUpController">
    	<property name="signInDao"><ref bean="signInDao" /></property>
    	<property name="methodNameResolver"><ref bean="methodNameResolver"/></property>
    	</bean>
    but then how i reach on the form so when i click on signup hyperlink from parent form i got an error that resource not found.

  4. #4

    Post wht is containt of your servlet context .xml file,

    Wht is containt of ur .xml file ?
    (Where u have writen that commandName)
    Success, a ongoing journey !

  5. #5

    Default

    I have already post the required part of xml above. the name of the file is login-servlet.xml.

  6. #6
    Join Date
    Sep 2004
    Location
    Manchester, NH
    Posts
    1,236

    Default

    commandName is only valid for controllers that extend BaseCommandController, which MultiActionController does not extend, therefore this will never work. Take a look at the Javadoc for MultiActionController - there's no commandName present in the class, or any of the parents.

  7. #7

    Default

    Instead of using a MultiActionController, use a SimpleFormController for your controller with the required definitions. For the two operations use a hidden key in your JSP

    Code:
    <input name ="operation" type="hidden">
    ..
    ..
    <input type = "button" name="Cancel" value = "Cancel" onClick = "javascript:setOperation('Cancel');">
    
    // Do the same for Submit

    to set the value to say 'Cancel' or 'Submit' upon click using javascript

    In your onSubmit()

    Code:
    if(request.getParameter("operation").equalsIgnoreCase("Cancel")  {
    response.sendRedirect(Cancel URL);
    }
    else if (request.getParameter("operation").equalIgnoreCase("Submit") {
    // validate, and insert data or anything else
    }

  8. #8

    Default

    If all you have is only Submit & Cancel, you could extend from CancellableFormController instead of SimpleFormController. And provide a parameter called cancelParamKey as part of your cancel url.

    But if you want to have a different (extensible) approach, like write a onSubmit() method and an onCancel() method, what you really need is MultiActionFormController.

    The final page of this thread http://forum.springframework.org/sho...FormController
    provides the complete code.

    That code can also do validate for each method separately.

Posting Permissions

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