2016-07-11 93 views
0

我正在從spring 4.X升級spring-mvc web應用程序以成爲彈簧引導戰。彈簧啓動1.3.5窗體:錯誤不顯示爲jsp

頁供應,形式發佈,執行驗證(並記錄一個錯誤),但JSP的確顯示形式的任何錯誤:錯誤

同一個JSP工作彈簧啓動的罰款之外。

要確保我設置我的春天啓動的JSP應用程序正確,我只是增加了一個表格郵寄到現有的「彈簧引導採樣網絡JSP」(見https://github.com/spring-projects/spring-boot/tree/1.3.x/spring-boot-samples

這裏是模型對象

package sample.jsp; 
    import java.io.Serializable; 
    public class EmailHolderPageModel implements Serializable { 
    private String emailAddress; 

    public EmailHolderPageModel() { 
     super(); 
    } 

    public EmailHolderPageModel(String emailAddress) { 
     super(); 
     this.emailAddress = emailAddress; 
    } 


    public String getEmailAddress() { 
     return emailAddress; 
    } 

    public void setEmailAddress(String emailAddress) { 
     this.emailAddress = emailAddress; 
    } 

} 

這裏是服務器側:

@Autowired 
private EmailSaveValidator emailSaveValidator; 

@RequestMapping("/saveEmail.html") 
public ModelAndView processEmail(@ModelAttribute("myModel") EmailHolderPageModel pageModel, BindingResult result){ 

    ModelAndView modelAndView = null; 

    emailSaveValidator.validate(pageModel, result); 

    if(result.hasErrors()){ 
     modelAndView = new ModelAndView("enterEmail"); 
     EmailHolderPageModel pm = new EmailHolderPageModel(""); 
     modelAndView.addObject("myModel", pm); 
     System.err.println("!!!Failed Validation!!!"); 

    } else { 

     modelAndView = new ModelAndView("thankyou"); 
     ThankyouPageModel thankYoupageModel = new ThankyouPageModel(); 
     modelAndView.addObject("thankyouModel", thankYoupageModel); 
    } 

    return modelAndView; 
} 

這裏是驗證

@Component 
public class EmailSaveValidator implements Validator { 

    public boolean supports(Class candidate) { 
     return EmailHolderPageModel.class.isAssignableFrom(candidate); 
    } 

    public void validate(Object obj, Errors errors) { 

     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emailAddress", "emailRequired", "required field"); 

    } 
} 

這裏是JSP(截斷了一點,因爲計算器是越來越糊塗)

<%@ page session="false"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 

<html> 
<head> 
    <title>test entering email</title> 
</head> 
<body> 

    <form:form commandName="myModel" method="POST" action="saveEmail.html" > 
     <form:errors path="emailAddress" htmlEscape="false" /> 
     <div id="formIntro"> 
      <spring:message text="enter email address" /> 
      <p><strong><label> 
       <spring:message text="email address:" /> </label><form:input path="emailAddress" size="35" maxlength="200"/> 
       </label> 
      </strong></p> 
     </div> 
     <input type="submit" value="Submit" /> 
    </form:form> 

</body> 
</html> 

POM的文件(從彈簧引導採樣網絡JSP未修改)

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <!-- Your own application should inherit from spring-boot-starter-parent --> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-samples</artifactId> 
     <version>1.3.6.BUILD-SNAPSHOT</version> 
    </parent> 
    <artifactId>spring-boot-sample-web-jsp</artifactId> 
    <packaging>war</packaging> 
    <name>Spring Boot Web JSP Sample</name> 
    <description>Spring Boot Web JSP Sample</description> 
    <url>http://projects.spring.io/spring-boot/</url> 
    <organization> 
     <name>Pivotal Software, Inc.</name> 
     <url>http://www.spring.io</url> 
    </organization> 
    <properties> 
     <main.basedir>${basedir}/../..</main.basedir> 
     <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot> 



    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 


     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 




     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
     </dependency> 



    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <useSystemClassLoader>false</useSystemClassLoader> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

==============

而解決的辦法是不要錯誤地創建一個新的模型對象(雖然工作正常,當不是一個春季啓動應用程序):

@RequestMapping("/saveEmail.html") 
public ModelAndView processEmail(@ModelAttribute("myModel") EmailHolderPageModel pageModel, BindingResult result){ 

    ModelAndView modelAndView = null; 

    emailSaveValidator.validate(pageModel, result); 

    if(result.hasErrors()){ 
     modelAndView = new ModelAndView("enterEmail"); 
     // !! SOLUTION !! 
     // DO NOT CREATE A NEW MODEL OBJECT 
     // !! SOLUTION !! 
     // EmailHolderPageModel pm = new EmailHolderPageModel(""); 
     modelAndView.addObject("myModel", pageModel); 
     System.err.println("!!!Failed Validation!!!"); 

    } else { 

     modelAndView = new ModelAndView("thankyou"); 
     ThankyouPageModel thankYoupageModel = new ThankyouPageModel(); 
     modelAndView.addObject("thankyouModel", thankYoupageModel); 
    } 

    return modelAndView; 
} 
+0

我沒有被使用Boot,但你可以嘗試啓用在覈心彈簧類上調試日誌記錄,看看它是否會流光溢彩 – bphilipnyc

回答

0

你的commandName應該是你模型類的名字:例如。

public class EmailHolderPageModel{}... 

而在你的控制器的任何功能:

public ModelAndView anythink(@Valid EmailHolderPageModel email...) 

所以,在你JSP表單應該是:

<form:form commandName="emailHolderPageModel" />... 
+0

感謝您的回答Tiago,但在我的情況下,它是通過返回傳入的相同模型對象來解決的。也許您的解決方案不會盡管:) –

+0

...... \ o/...... –