2012-06-19 12 views
5

Próbuję sprawdzić poprawność formularza w JSP ze Spring i Hibernate przy użyciu HibernateValidator. Strona JSP Temp.jsp jest następująca (URL w web.xml to *.htm).Wyjątek: "Brak adaptera dla programu obsługi. Czy program obsługi implementuje obsługiwany interfejs, taki jak kontroler?"

<%@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> 

Klasa validationForm jest następujący.

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; 
    } 
} 

a klasa Controller gdzie walidacji powinny być przetwarzane są następujące (używam 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; 
    } 
} 

W dispatcher-servlet, I dodano następujące.

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

Próbowano również dodać następującą fasolkę, ale wciąż nie ma szczęścia.

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

Gdzie interfejs TempService jest następujący.

package usebeans; 

import validators.ValidationForm; 

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

i po to klasa TempServiceImpl.

package usebeans; 

import validators.ValidationForm; 

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

Chociaż klasa TempServiceImpl implementuje interfejs TempService, otrzymuję następujący wyjątek.

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) 

Edit:

Chociaż Obserwuję co wyjaśniono here, problem pozostaje i dostaję ten sam wyjątek jak wspomniano powyżej. Jakie ustawienia konfiguracji tu brakuje? Może być w pliku dispatcher-servlet.xml. Cały plik dispatcher-servlet.xml jest następujący.

<?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> 

Nie mam żadnego konkretnego pomysłu na temat tego wyjątku. Czy możesz dowiedzieć się, dlaczego ten wyjątek jest odrzucany? Jakie ustawienia konfiguracji lub coś innego tu brakuje?

+0

która jest używana wersja wiosnę? –

+0

Wersja wiosna to '3.0.2' – Tiny

+0

Czy na pewno chcesz użyć' ControllerClassNameHandlerMapping'? Czy możesz usunąć tę fasolę i spróbować raz? –

Odpowiedz

1

Naprawiłem problem, należy znaleźć nowe 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 był związany <prop key="Temp.htm">tempController</prop>.

Dla drugiego błędu zmienić klasę Temp jak poniżej

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

Następnie generuje nowy wyjątek 'java.lang.IllegalStateException: Ani BindingResult ani zwykły obiekt docelowy dla nazwy komponentu bean 'validationForm "dostępny jako atrybut żądania" oznacza, że ​​* obiekt polecenia * nie jest dostępny dla kontrolera. (Strona JSP nie jest powiązana z klasą "ValidationForm"). – Tiny

+0

Zmodyfikowałem klasę kontrolera 'Temp' dokładnie tak, jak wspomniałeś, ale niestety jest to ten sam wyjątek, o którym wspomniano w poprzednim komentarzu. Odpowiedź może być jednak bardzo bliska. – Tiny

+0

Nie korzystałem z jsp ... więc nie sądzę, żebym mógł ci pomóc z problemem błędu bindowania ... Ale możesz polecić ten link http://www.springbyexample.org/examples/spring-web- flow-subflow-webapp-jsp-example.html, aby zobaczyć, jak można to zrobić. –

Powiązane problemy