春季:@Valid始终返回False

时间:2019-04-29 19:14:57

标签: spring-mvc

我是Spring框架的新手。我正在尝试让@Valid工作。数据绑定正确进行,但验证无效。 hasErrors()在Controller类中始终返回False。请参见下面的代码。

我正在使用Spring 4.1.3和Hibernate验证程序6.0.16。

上下文xml

stdout_data

控制器

stderr_data

查看

<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:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
     </bean>

    <context:property-placeholder location="classpath:/config.properties"/>
    <context:annotation-config />
    <mvc:annotation-driven />
    <context:component-scan base-package="com.personal, com.documentum" />
</beans>

模型

SearchForm模型:

package com.personal.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.personal.search.model.SearchForm;
import com.personal.search.service.SearchService;

@Controller
public class SearchController {

    private SearchService service;

    @Autowired
    public SearchController(SearchService service) {
        this.service = service;
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String searchHome(Model model) {
        model.addAttribute(new SearchForm());
        return "search/search";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String searchResults(@Valid SearchForm searchForm, BindingResult errors, Model model) {
        if (!errors.hasErrors()) {
            System.out.println(searchForm.getObjectName());
            model.addAttribute(service.getResults(searchForm));
        }
        return "search/search";
    }

}

SearchResult模型:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <sf:form method="POST" commandName="searchForm">
        <sf:errors path="*" />
        <label>Enter Object Name:</label>
        <sf:input path="objectName"/><sf:errors path="objectName" /><br>
        <button type="submit" value="Submit">Submit</button>
    </sf:form>
    <h3>For your search term "${searchForm.objectName}" below are the results: </h3>
    <c:forEach items="${searchResultList}" var="searchResult" >
        <li>
            <div>
                <span>
                (<c:out value="${searchResult.objectName}" />,
                <c:out value="${searchResult.title}" />)</span>
            </div>
        </li>
    </c:forEach>
</body>
</html>

服务

package com.personal.search.model;

import javax.validation.constraints.NotBlank;

public class SearchForm {

    @NotBlank
    private String objectName;

    public SearchForm() {
    }

    public SearchForm(String objectName) {
        this.objectName = objectName;
    }

    public String getObjectName() {
        return objectName;
    }

    public void setObjectName(String objectName) {
        this.objectName = objectName;
    }

}

DAO

package com.personal.search.model;

public class SearchResult {

    private String objectName;
    private String title;

    public SearchResult() {
    }

    public String getObjectName() {
        return objectName;
    }
    public void setObjectName(String name) {
        this.objectName = name;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }



}

我希望hasErrors()输出为True。

1 个答案:

答案 0 :(得分:0)

这可能是因为您将验证定义为,

@Null
@Size(min=1, max=30)
private String objectName;

检查向控制器提交请求时,objectName是否具有NULL值或空字符串?

对于字符串,您必须使用@NotBlank而不是@Null