2012-06-19 13 views
5

Estoy intentando validar un formulario simple en JSP con Spring e Hibernate usando HibernateValidator. La página JSP Temp.jsp es la siguiente (la URL pttern en web.xml es *.htm).Excepción: "No hay ningún adaptador para controlador. ¿Su controlador implementa una interfaz compatible como controlador?"

<%@page contentType="text/html" pageEncoding="UTF-8" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 

<form:form method="post" action="Temp.htm" commandName="validationForm"> 
    <!--validationForm is a model class--> 
<table> 
    <tr> 
     <td>User Name:<font color="red"><form:errors path="userName" /></font></td> 
    </tr> 

    <tr> 
     <td><form:input path="userName" /></td> 
    </tr> 

    <tr> 
     <td>Age:<font color="red"><form:errors path="age" /></font></td> 
    </tr> 

    <tr> 
     <td><form:input path="age" /></td> 
    </tr> 

    <tr> 
     <td>Password:<font color="red"><form:errors path="password" /></font></td> 
    </tr> 

    <tr> 

    <td><form:password path="password" /></td> 

    </tr> 

    <tr> 
     <td><input type="submit" value="Submit" /></td> 
    </tr> 
    </table> 

</form:form> 

La clase validationForm es la siguiente.

package validators; 

import javax.validation.constraints.Max; 
import javax.validation.constraints.Min; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
import org.hibernate.validator.constraints.NotEmpty; 
import org.springframework.format.annotation.NumberFormat; 
import org.springframework.format.annotation.NumberFormat.Style; 

final public class ValidationForm 
{ 
    @NotEmpty 
    @Size(min = 1, max = 20) 
    private String userName; 
    @NotNull 
    @NumberFormat(style = Style.NUMBER) 
    @Min(1) 
    @Max(110) 
    private Integer age; 
    @NotEmpty(message = "Password must not be blank.") 
    @Size(min = 1, max = 10, message = "Password must between 1 to 10 Characters.") 
    private String password; 

    public void setUserName(String userName) 
    { 
      this.userName = userName; 
    } 

    public String getUserName() 
    { 
      return userName; 
    } 

    public void setAge(Integer age) 
    { 
      this.age = age; 
    } 

    public Integer getAge() 
    { 
      return age; 
    } 

    public void setPassword(String password) 
    { 
      this.password = password; 
    } 

    public String getPassword() 
    { 
      return password; 
    } 
} 

y la clase Controller donde la validación se debe procesar es como sigue (estoy usando SimpleFormController).

package controller; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.validation.BindException; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 
import usebeans.TempService; 
import validators.ValidationForm; 

@SuppressWarnings("deprecation") 
final public class Temp extends SimpleFormController 
{ 
    private TempService tempService=null; 
    public Temp() 
    { 
     //setCommandClass(Temp.class); 
     //setSuccessView("Temp"); 
     //setFormView("Temp"); 

     setCommandClass(ValidationForm.class); //Still not working. 
     setCommandName("validationForm"); 
    } 

    public void setTempService(TempService tempService) 
    { 
     this.tempService = tempService; 
    } 

    @Override 
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception 
    { 
     ModelAndView mv=new ModelAndView(); 
     ValidationForm validationForm=(ValidationForm) command; 
     tempService.add(validationForm); 
     return mv; 
    } 

    @Override 
    protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception 
    { 
     ModelAndView mv=new ModelAndView(); 
     return mv; 
    } 
} 

En dispatcher-servlet, he añadido lo siguiente.

<bean id="tempService" class="usebeans.TempServiceImpl" /> 
<bean name="/Temp.htm" class="controller.Temp" p:tempService-ref="tempService" p:formView="Temp" p:successView="Temp" /> 

También intenté agregar el siguiente bean todavía no hay suerte.

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

Cuando la interfaz TempService es como sigue.

package usebeans; 

import validators.ValidationForm; 

public interface TempService 
{ 
    public void add(ValidationForm validationForm); 
} 

y siguientes es la clase TempServiceImpl.

package usebeans; 

import validators.ValidationForm; 

final public class TempServiceImpl implements TempService 
{ 
    public void add(ValidationForm validationForm) 
    { 
     System.out.println("Message"); 
    } 
} 

Aunque la clase TempServiceImpl implementa la interfaz TempService, estoy recibiendo la siguiente excepción.

javax.servlet.ServletException: No adapter for handler [[email protected]]: Does your handler implement a supported interface like Controller? 
at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:982) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:770) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
at java.lang.Thread.run(Thread.java:619) 

Editar:

Aunque estoy siguiendo lo que se explica here, el problema permanece y estoy recibiendo la misma excepción como se mencionó anteriormente. ¿Qué configuración de configuración me falta aquí? Puede estar en el archivo dispatcher-servlet.xml. El archivo completo dispatcher-servlet.xml es el siguiente.

<?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:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 

     xmlns:tx="http://www.springframework.org/schema/tx" 
     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/tx http://www.springframework.org/schema/tx/spring-tx-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-3.0.xsd"> 

     <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>  
     <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 


     <bean id="tempService" class="usebeans.TempServiceImpl" /> 
     <bean name="/Temp.htm" class="controller.Temp" p:tempService-ref="tempService" p:formView="Temp" p:successView="Temp" /> 


     <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
      <property name="mappings"> 
       <props> 
        <prop key="index.htm">indexController</prop>     
        <prop key="Temp.htm">tempService</prop>     
       </props> 
      </property> 
     </bean> 

     <bean id="viewResolver" 
       class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
       p:prefix="/WEB-INF/jsp/" 
       p:suffix=".jsp" /> 


     //The index controller. 

     <bean name="indexController" 
       class="org.springframework.web.servlet.mvc.ParameterizableViewController" 
       p:viewName="index" /> 

</beans> 

No tengo ninguna idea precisa sobre la excepción lanzada. ¿Puedes averiguar por qué se lanza esa excepción? ¿Qué configuración de configuración o algo más me falta aquí?

+0

el que se utiliza la versión de la primavera? –

+0

La versión de primavera es '3.0.2' – Tiny

+0

¿Estás seguro de que deseas utilizar' ControllerClassNameHandlerMapping'? ¿Puedes quitar este grano y probarlo una vez? –

Respuesta

1

He arreglado el problema, encontrar el nuevo xml

<?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:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
    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/tx http://www.springframework.org/schema/tx/spring-tx-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-3.0.xsd"> 

    <bean 
     class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 
    <bean 
     class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 


    <bean id="tempService" class="usebeans.TempServiceImpl" /> 
    <bean id="tempController" class="controller.Temp"/> 


    <bean id="urlMapping" 
     class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="mappings"> 
      <props> 
       <prop key="index.htm">indexController</prop> 
       <prop key="Temp.htm">tempController</prop> <!-- You need to mapp the url to the controller bean--> 
      </props> 
     </property> 
    </bean> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
     p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

    <bean name="indexController" 
     class="org.springframework.web.servlet.mvc.ParameterizableViewController" 
     p:viewName="index" /> 

</beans> 

Fix estaba relacionado con <prop key="Temp.htm">tempController</prop>.

Para el segundo error cambiar la clase de Temp como abajo

package controller; 

import java.util.HashMap; 
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.validation.BindException; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 
import usebeans.TempService; 
import validators.ValidationForm; 

@SuppressWarnings("deprecation") 
final public class Temp extends SimpleFormController { 
    private TempService tempService = null; 

    public Temp() { 
     // setCommandClass(Temp.class); 
     // setSuccessView("Temp"); 
     // setFormView("Temp"); 

     setCommandClass(ValidationForm.class); // Still not working. 
     setCommandName("validationForm"); 
    } 

    public void setTempService(TempService tempService) { 
     this.tempService = tempService; 
    } 

    @Override 
    protected ModelAndView onSubmit(HttpServletRequest request, 
      HttpServletResponse response, Object command, BindException errors) 
      throws Exception { 
     ModelAndView mv = new ModelAndView(); 
     ValidationForm validationForm = (ValidationForm) command; 
     tempService.add(validationForm); 
     return mv; 
    } 

    @Override 
    protected ModelAndView showForm(HttpServletRequest request, 
      HttpServletResponse response, BindException errors) 
      throws Exception { 
     Map<String, Object> model = new HashMap<String, Object>(); 
     model.put(getCommandName(), new ValidationForm()); 
     ModelAndView mv = new ModelAndView("Temp", model); 
     return mv; 
    } 
} 
+0

Luego arroja una nueva excepción 'java.lang.IllegalStateException: Ni BindingResult ni el objeto de destino simple para bean name 'validationForm 'disponible como atributo de solicitud' significa que el * objeto de comando * no está disponible para el controlador. (La página JSP no está vinculada a la clase 'ValidationForm'). – Tiny

+0

he modificado la clase 'Temp' controlador exactamente como como usted ha mencionado, pero lamentablemente es tirar la misma excepción que se menciona en el comentario anterior. La respuesta puede ser muy cercana sin embargo. – Tiny

+0

No he utilizado JSP ... así que no creo que pueda ayudar con el problema de error se unen ... Pero se puede hacer referencia este enlace http://www.springbyexample.org/examples/spring-web- flow-subflow-webapp-jsp-example.html para ver cómo se puede hacer. –

Cuestiones relacionadas