2012-06-19 16 views
5

Tôi đang cố gắng xác thực một biểu mẫu đơn giản trong JSP với Spring và Hibernate bằng cách sử dụng HibernateValidator. Trang Temp.jsp của JSP như sau (url pttern trong web.xml là *.htm).Ngoại lệ: "Không có bộ điều hợp cho trình xử lý. Trình xử lý của bạn có triển khai giao diện được hỗ trợ như bộ điều khiển không?"

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

Lớp validationForm như sau.

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

Controller lớp nơi quá trình xác thực sẽ được xử lý như sau (Tôi đang sử dụng 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; 
    } 
} 

Trong dispatcher-servlet, tôi đã thêm phần sau đây.

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

Ngoài ra, hãy thử thêm bean sau đây vẫn không có may mắn.

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

Nơi giao diện TempService như sau.

package usebeans; 

import validators.ValidationForm; 

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

và sau là lớp TempServiceImpl.

package usebeans; 

import validators.ValidationForm; 

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

Mặc dù lớp TempServiceImpl cài đặt giao diện TempService, tôi nhận được ngoại lệ sau.

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:

Mặc dù tôi sau những gì được giải thích here, vấn đề vẫn còn và tôi nhận được cùng một ngoại lệ như đã đề cập ở trên. Tôi thiếu cài đặt cấu hình nào ở đây. Nó có thể nằm trong tệp dispatcher-servlet.xml. Toàn bộ tập tin dispatcher-servlet.xml như sau.

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

Tôi không có bất kỳ ý tưởng chính xác nào về ngoại lệ đó. Bạn có thể tìm ra lý do tại sao ngoại lệ đó bị ném ra? Tôi đang thiếu cài đặt cấu hình nào khác?

+0

phiên bản của mùa xuân được sử dụng? –

+0

Phiên bản mùa xuân là '3.0.2' – Tiny

+0

Bạn có chắc chắn muốn sử dụng' ControllerClassNameHandlerMapping' không? Bạn có thể loại bỏ đậu này và thử một lần? –

Trả lời

1

Tôi đã khắc phục vấn đề này, xin vui lòng tìm xml mới

<?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 được liên quan đến <prop key="Temp.htm">tempController</prop>.

Đối với lỗi thứ hai thay đổi lớp Temp như sau

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

Sau đó, nó ném một ngoại lệ mới 'java.lang.IllegalStateException: Cả BindingResult lẫn đối tượng đích đơn giản cho bean name 'validationForm 'có sẵn dưới dạng thuộc tính yêu cầu' có nghĩa là * đối tượng lệnh * không có sẵn cho bộ điều khiển. (Trang JSP không bị ràng buộc vào lớp 'ValidationForm'). – Tiny

+0

Tôi sửa đổi lớp điều khiển 'Temp' chính xác như bạn đã đề cập nhưng tiếc là nó ném cùng một ngoại lệ như đã đề cập trong bình luận trước đó. Câu trả lời có thể là rất gần mặc dù. – Tiny

+0

Tôi đã không sử dụng jsp ... vì vậy tôi không nghĩ rằng tôi có thể giúp bạn với vấn đề lỗi liên kết ... Nhưng bạn có thể tham khảo liên kết này http://www.springbyexample.org/examples/spring-web- flow-subflow-webapp-jsp-example.html để xem nó có thể được thực hiện như thế nào. –

Các vấn đề liên quan