gpt4 book ai didi

java - spring:bind 和 JSR-303 验证。验证失败时无法在页面上显示错误消息

转载 作者:行者123 更新时间:2023-11-30 08:01:16 25 4
gpt4 key购买 nike

我需要一些帮助。我在做我喜欢的项目时遇到了麻烦。这是一个基于 spring mvc 的简单 CRUD 应用程序。问题是,当我的 profile.jsp 中输入验证失败时,我无法收到错误消息。我的 signup.jsp 中有大部分相同的代码,但一切正常。

这是我的 Controller 方法:

@RequestMapping(value = "/profile", method = RequestMethod.GET)
public String getUserProfile(Model model) {
model.addAttribute("userDetailsForm", new UserDetailsFormDTO());
model.addAttribute("passwordForm" ,new PasswordFormDTO());
model.addAttribute("profile", getCurrentUser());
return "profile";
}

@RequestMapping(value = "/profile/details/change", method = RequestMethod.POST)
public String changeUserDetails(@ModelAttribute("userDetailsForm") @Valid UserDetailsFormDTO form,
BindingResult result) {
if(result.hasErrors()){
result.getAllErrors().forEach(log::debug);
return "redirect:/profile";
}
userService.changeUserDetails(getCurrentUser(), form);
return "redirect:/profile?success=details";
}

我正在使用 JSR 303 验证:

package org.crud.dto;

import java.io.Serializable;

import javax.validation.constraints.Pattern;

import org.crud.validation.InputValidator;
import org.hibernate.validator.constraints.NotEmpty;

public class UserDetailsFormDTO implements Serializable{

private static final long serialVersionUID = -7603395840362468805L;

@NotEmpty(message="{error.null_form_value}")
@Pattern(regexp=InputValidator.FIRSTNAME_PATTERN, message="{error.name_invalid}")
private String firstName;

@NotEmpty(message="{error.null_form_value}")
@Pattern(regexp=InputValidator.LASTNAME_PATTERN, message="{error.name_invalid}")
private String lastName;

public UserDetailsFormDTO() {}

public UserDetailsFormDTO(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

}

在配置文件中我声明了下一个bean:

<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"
p:validationMessageSource-ref="messageSource" />

<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>

类路径上还有两个 .properties 文件,其中包含我的标签和错误代码:messages_rumessages_en

我的profile.jsp代码片段:

<div id="user-details-upd" class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Update user details</h3>
</div>
<div class="panel-body">
<div class="container-fluid">

<form name="userDetailsForm" class="form-horizontal" role="form" method="POST" action="profile/details/change">
<spring:bind path="userDetailsForm"></spring:bind>
<div class="form-group">
<div class="row">
<label for="fname-input" class="col-md-offset-2 col-md-2 control-label">First name:</label>
<div class="col-md-5">
<spring:message code="label.fname_placeholder" var="fNameHolder" />
<spring:bind path="userDetailsForm.firstName">
<input type="text" value="${profile.getFirstName()}" name="<c:out value="${status.expression}"/>" class="form-control" placeholder="${fNameHolder}" required>
<c:if test="${status.error}">
<c:forEach items="${status.errorMessages}" var="error">
<small class="text-danger"> <c:out value="${error}" />
</small>
</c:forEach>
</c:if>
</spring:bind>
</div>
</div>
</div>

<div class="form-group">
<div class="row">
<label for="lname-input" class="col-md-offset-2 col-md-2 control-label">Last name:</label>
<div class="col-md-5">
<spring:message code="label.lname_placeholder" var="lNameHolder" />
<spring:bind path="userDetailsForm.lastName">
<input type="text" value="${profile.getLastName()}" name="<c:out value="${status.expression}"/>" class="form-control" placeholder="${lNameHolder}" required>
<c:if test="${status.error}">
<c:forEach items="${status.errorMessages}" var="error">
<small class="text-danger"> <c:out value="${error}" />
</small>
</c:forEach>
</c:if>
</spring:bind>
</div>
</div>
</div>

<div class="form-group">
<div class="row">
<div class="col-md-offset-4 col-md-5">
<button type="submit" value="Submit" class="btn btn-success">
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span> Update
</button>
</div>
</div>
</div>

</form>
</div>
</div>
</div>

当我在姓氏输入中提交不正确的数据时,来自调试的消息:

2015-08-07 18:52:29 DEBUG UserController:? - Field error in object 'userDetailsForm' on field 'lastName': rejected value [jh]; codes [Pattern.userDetailsForm.lastName,Pattern.lastName,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userDetailsForm.lastName,lastName]; arguments []; default message [lastName],[Ljavax.validation.constraints.Pattern$Flag;@657f42ee,([A-Z�-�][a-zA-Z�-�]*)([\s\'-][A-Z�-�][a-z�-�]*)*]; default message [Name must contain only characters and first letter must be in uppercase]

我不明白,为什么 BindingResult 有错误时 status.errorMessages 为空?

如有任何帮助或建议,我们将不胜感激。提前致谢

最佳答案

您正在 Controller 的请求映射 block 中使用重定向。重定向是发送到浏览器的 header 。浏览器发起重定向,因此您会从浏览器收到一个全新的请求,并且由于 http 是无状态的,因此您会丢失先前请求/响应中存储的任何内容,例如 BindingResult。

删除重定向并使用字符串转发到 jsp 页面。您可以为此使用内部 View 解析器

关于java - spring:bind 和 JSR-303 验证。验证失败时无法在页面上显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com