2015-05-20 2 views
5

sto ottenendo questa eccezione sull'aggiunta RedirectAttributes nel metodo di gestione delle richieste in Controller -redirectattributes argomento è di tipo di modello o una mappa, ma non è assegnabile dal modello attuale

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public java.lang.String com.vc.teacher.controller.AccountController.signUpUser(com.vc.teacher.entities.User,org.springframework.web.servlet.mvc.support.RedirectAttributes)]; nested exception is java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model. You may need to switch newer MVC infrastructure classes to use this argument. 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
root cause 

org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public java.lang.String com.vc.teacher.controller.AccountController.signUpUser(com.vc.teacher.entities.User,org.springframework.web.servlet.mvc.support.RedirectAttributes)]; nested exception is java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model. You may need to switch newer MVC infrastructure classes to use this argument. 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:182) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
root cause 

java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model. You may need to switch newer MVC infrastructure classes to use this argument. 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:326) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:172) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 

Il mio file di fagioli-config è -

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 


    <mvc:annotation-driven /> 
    <context:component-scan base-package="com.vc.teacher" /> 


    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.vc.teacher.entities.User</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.current_session_context_class">thread</prop> 
       <prop key="show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 



    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
     <property name="url" value="jdbc:mysql://localhost:3306/teacher"></property> 
     <property name="username" value="root"></property> 
     <property name="password" value="root"></property> 
    </bean> 

    <bean id="userDao" class="com.vc.teacher.db.dao.UserDao"> 
     <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 


</beans> 

mio controller è -

package com.vc.teacher.controller; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.support.RedirectAttributes; 

import com.vc.teacher.db.dao.UserDao; 
import com.vc.teacher.entities.User; 

@Controller 
public class AccountController { 

    @RequestMapping("/login") 
    public ModelAndView loginUser(@RequestParam("email") String email, 
      @RequestParam("password") String password) { 
     ApplicationContext context = new ClassPathXmlApplicationContext(
       "applicationContext.xml"); 
     User user = ((UserDao) context.getBean("userDao")).checkCreditionals(
       email, password); 
     if (user != null) 
      return new ModelAndView("jsp/result", "message", 
        "successfully login with user = " + email); 
     else 
      return new ModelAndView("jsp/index", "message", "invalid login"); 
    } 

    @RequestMapping("/signUp") 
    public String initilize(Model model) { 
     model.addAttribute(new User()); 
     return "jsp/signup"; 
    } 

    @RequestMapping(method=RequestMethod.POST,value="/register") 
    public String signUpUser(User user,RedirectAttributes attributes) { 
     boolean result = false; 

     ApplicationContext context = new ClassPathXmlApplicationContext(
       "applicationContext.xml"); 
     result = ((UserDao)context.getBean("userDao")).registerUser(user); 



     if (result == true){ 
      attributes.addFlashAttribute("message", 
        "You are ready to go now !"); 
      return "redirect:/signUp"; 
     } else{ 
      attributes.addFlashAttribute("message", 
        "Something went wrong"); 
       return "redirect:/signUp"; 
      } 


    } 
} 

Il mio file primavera-servlet.xml è -

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-4.0.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> 

<context:component-scan base-package="com.vc.teacher.controller" /> 

<!-- Configuration defining views files --> 

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
</bean> 

</beans> 

Desidero aggiungere attributi nella richiesta di reindirizzamento. Per quello sto usando la classe RedirectAttributes. Ma dopo aver aggiunto il suo oggetto nel mio parametro metodo, il mio metodo non viene richiamato. Sto usando la molla 4.1.6.

+0

Si prega di inviare la traccia dello stack. –

+0

@SotiriosDelimanolis aggiunto ora –

risposta

8

Spostare

<mvc:annotation-driven /> 

alla configurazione contesto servlet. Poiché è assente, Spring DispatcherServlet utilizza la sua configurazione predefinita, che utilizza il deprecato AnnotationMethodHandlerAdapter anziché il più sofisticato RequestMappingHandlerAdapter.

Inoltre,

<context:component-scan base-package="com.vc.teacher" /> 

è un superset di

<context:component-scan base-package="com.vc.teacher.controller" /> 

Così si avrà definizioni di fagioli duplicati per eventuali fagioli sotto com.vc.teacher.controller. Risolvi il problema rendendo il tuo componente scansionato distinto.