【问题标题】:spring form validation BindingResult always returns falsespring 表单验证 BindingResult 总是返回 false
【发布时间】:2016-10-28 22:50:45
【问题描述】:

我正在使用 spring 表单验证来验证我的表单输入字段..我遇到了 BindingResult 问题,即使我的输入字段为空/空,result.hasErrors() 总是返回 false..我管理所有导入和对我来说一切都很好。但正如我所说,我的验证不起作用,需要帮助来解决这个问题......

表格:

  <%@include file="././Header.jsp"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<script src="<c:url value="/js/smlibray/emailCommunicate.js"/>"></script>
 <link href="<c:url value="/js/jquery-ui.css"/>" rel="stylesheet" />
<script src="<c:url value="/js/jquery-ui.js"/>"></script>

<input type="hidden" name="applicationUrl" id="applicationUrl"
    value="${pageContext.request.contextPath}">

<div class="container sec-container middle-sec">
    <div class="form-fields row">
        <div class="col-md-12 col-sm-12 col-xs-12">
            <form:form class="form-horizontal policy-form" id="emailCommu-form"  method="POST" action="sendEmailMessage" commandName="emailForm">
                <div class="form-group">
                <h1 class="email-header">SiteMidner Email Notification</h1>
                <c:choose>
                    <c:when test="${not empty sMsg}">
                        <div class="email-Commu-SMsg">* ${sMsg}</div>
                    </c:when>
                    <c:otherwise>
                        <c:if test="${not empty eMsg}">
                            <div class="email-Commu-EMsg">* ${eMsg}</div>
                        </c:if>
                    </c:otherwise>
                </c:choose>
                <div class="form-emailCommu">
                    <label for="emailSub-txtArea" class="email-ContentHead">Enter
                        the Subject Line for the Email : </label>
                    <div class="email-sm-textDiv">
                        <form:textarea path="emailSubject" name="emailSubject" id="emailSubTxtArea"
                            placeholder="Email Subject"/>
                    </div>
                    <span><form:errors path="emailSubject" cssClass="error" /></span>

                </div>

                <div class="form-emailCommu">
                    <label for="emailBod-txtArea" class="email-ContentHead">Enter
                        the Message Body for the Email : </label>
                    <div class="email-sm-textDiv">
                        <form:textarea path="emailMsg" name="emailMsg" id="emailBodyTxtArea"
                            placeholder="Email Body"/>
                    </div>
                    <span><form:errors path="emailMsg" cssClass="error" /></span>

                </div>

                <div class="email-sendButton">
                    <input type="submit" class="styled-button" value="Send Email"></input>
                </div>
                </div>
            </form:form>

        </div>
        <!--form-fields close -->
    </div>
</div>

控制器代码:

@RequestMapping(value="/sendEmailMessage",method=RequestMethod.POST)
public ModelAndView sendEmailCommunication(@Valid @ModelAttribute("emailForm") EmailReqInfo emailInfo,BindingResult result,HttpServletRequest request){
    ModelAndView view = null;
    StringBuffer sMsg = new StringBuffer();
    StringBuffer eMsg = new StringBuffer();
    boolean isAdmin = false;
    try{
    String loggedInUser = request.getHeader("sm_user").trim();
     isAdmin = getUserAdminRights(request);

     if(result.hasErrors()){
         view = new ModelAndView("EmailCommunication");
         view.addObject("isAdmin", isAdmin);
         return view;
     }
     else{
        String emailSubject = emailInfo.getEmailSubject();
        String emailMsg  = emailInfo.getEmailMsg().replace("\n", "<br />\n");
    boolean status = emailService.sendEmailCommuncation(emailSubject,emailMsg);
    if(status){
        sMsg.append(" Sending SiteMinder Notification Email was Success.");
    }
    else{
        eMsg.append(" Oops! Something went wrong while sending Email Notification. Pls check logs");
    }
    }
    }
    catch(Exception ex){
        ex.printStackTrace();
        eMsg.append("Oops! Something went wrong while sending Email Notification. Pls check logs");
    }
    view = new ModelAndView("EmailCommunication");
    view.addObject("emailForm", new EmailReqInfo());
    view.addObject("isAdmin", isAdmin);
    view.addObject("sMsg", sMsg.toString());
    view.addObject("eMsg", eMsg.toString());
    return view;
}

电子邮件型号:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

public class EmailReqInfo 
{

    @NotNull @NotEmpty
    @Size(min=1)
    private String emailSubject;
    @NotNull @NotEmpty
    private String emailMsg;
    public String getEmailSubject() {
        return emailSubject;
    }
    public void setEmailSubject(String emailSubject) {
        this.emailSubject = emailSubject;
    }
    public String getEmailMsg() {
        return emailMsg;
    }
    public void setEmailMsg(String emailMsg) {
        this.emailMsg = emailMsg;
    }
}

我的 spring-mvc.xml 中有必要的注释

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
    <bean id="jacksonMessageConverter" 
      class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
  </mvc:message-converters>
  </mvc:annotation-driven>

修复验证需要帮助..谢谢

【问题讨论】:

  • 您在绑定结果中遇到哪些字段错误?你能发帖吗
  • 嗨 Sarvana,我没有收到任何错误,即,即使我向模型发送了空输入,result.hasErrors() 总是返回 false,因此它没有进入 if 条件。我没有看到任何错误..任何想法,我哪里出错了..

标签: java spring validation jsp spring-mvc


【解决方案1】:

@NotNull:检查值是否不为空,忽略内容。

@NotEmpty:检查值是否不为空或为空。如果它只有空格,它将允许它不为空。

@NotBlank:检查值是否不为空或不为空,先修剪值。这意味着,它不会只允许空格

所以,如果你想验证一个字段不为空,而且它不仅有空格,还有文本,你应该使用@NotBlank。

这个例子是有效的,尝试做同样的事情:

实体:

@Entity
@Table(name="EMPLOYEE")
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Size(min=3, max=50)
    @Column(name = "NAME", nullable = false)
    private String name;

    @NotNull
    @DateTimeFormat(pattern="dd/MM/yyyy") 
    @Column(name = "JOINING_DATE", nullable = false)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")
    private LocalDate joiningDate;

    @NotNull
    @Digits(integer=8, fraction=2)
    @Column(name = "SALARY", nullable = false)
    private BigDecimal salary;

    @NotEmpty
    @Column(name = "SSN", unique=true, nullable = false)
    private String ssn;
//getter & setter
}

控制器:

@RequestMapping(value = { "/new" }, method = RequestMethod.POST)
    public String saveEmployee(@Valid Employee employee, BindingResult result,
            ModelMap model) {

        if (result.hasErrors()) {
            return "registration";
        }


        service.saveEmployee(employee);

        model.addAttribute("success", "Employee " + employee.getName() + " registered successfully");
        return "success";
    }

registation.jsp

<h2>Registration Form</h2>

    <form:form method="POST" modelAttribute="employee">
        <form:input type="hidden" path="id" id="id"/>
        <table>
            <tr>
                <td><label for="name">Name: </label> </td>
                <td><form:input path="name" id="name"/></td>
                <td><form:errors path="name" cssClass="error"/></td>
            </tr>

            <tr>
                <td><label for="joiningDate">Joining Date: </label> </td>
                <td><form:input path="joiningDate" id="joiningDate"/></td>
                <td><form:errors path="joiningDate" cssClass="error"/></td>
            </tr>

            <tr>
                <td><label for="salary">Salary: </label> </td>
                <td><form:input path="salary" id="salary"/></td>
                <td><form:errors path="salary" cssClass="error"/></td>
            </tr>

            <tr>
                <td><label for="ssn">SSN: </label> </td>
                <td><form:input path="ssn" id="ssn"/></td>
                <td><form:errors path="ssn" cssClass="error"/></td>
            </tr>

            <tr>
                <td colspan="3">
                    <c:choose>
                        <c:when test="${edit}">
                            <input type="submit" value="Update"/>
                        </c:when>
                        <c:otherwise>
                            <input type="submit" value="Register"/>
                        </c:otherwise>
                    </c:choose>
                </td>
            </tr>
        </table>
    </form:form>

【讨论】:

    【解决方案2】:

    我发现 Hibernate 验证器有问题。 @NotEmpty 无论如何都在 @NotNull 之上。

    尝试从表单中删除@NotEmpty 验证约束并再次执行。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多