我想验证我的表单,但这不工作.我的实体类
import java.io.Serializable;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
@Entity
@Table(name = "users")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "id")
private Integer id;
@NotNull
@Size(max = 20)
@Column(name = "username")
private String username;
@NotNull
@Size(max = 20)
@Column(name = "password")
private String password;
@NotNull
@Size(max = 20)
@Column(name = "firstName")
private String firstName;
@NotNull
@Size(max = 20)
@Column(name = "lastName")
private String lastName;
@Size(min = 11, max = 11)
@Column(name = "personalId")
private String personalId;
@Size(max = 40)
@Column(name = "city")
private String city;
@Size(max = 40)
@Column(name = "address")
private String address;
@NotNull
@Email
@Size(max = 30)
@Column(name = "email")
private String email;
@Size(min = 9, max = 9)
@Column(name = "phone")
private String phone;
@OneToMany(mappedBy = "user")
private Set<UserRole> userRoleSet;
}
jsp和表单转到addAdmin页面:
<form action="addAdminForm" method="post">
<input type="submit" value="Dodaj administratora" />
</form>
添加Admin.jsp页面公式:
<form:form action="addAdmin" modelAttribute="user" method="post">
<form:label path="username">Login: </form:label>
<form:input path="username" />
<form:errors path="username" cssClass="error" />
<br />
<form:label path="password">Hasło: </form:label>
<form:password path="password" />
<form:errors path="password" cssClass="error" />
<br />
<form:label path="firstName">Imię: </form:label>
<form:input path="firstName" />
<form:errors path="firstName" cssClass="error" />
<br />
<form:label path="lastName">Nazwisko: </form:label>
<form:input path="lastName" />
<form:errors path="lastName" cssClass="error" />
<br />
<form:label path="email">Email: </form:label>
<form:input path="email" />
<form:errors path="email" cssClass="error" />
<br />
<input type="submit" value="Dodaj" />
</form:form>
控制器:
@RequestMapping(value = "/admin/addAdminForm", method = RequestMethod.POST)
public ModelAndView goAddAdminForm() {
ModelAndView mav = new ModelAndView("admin/addadmin");
mav.addObject("user", new User());
return mav;
}
@RequestMapping(value = "/admin/addAdmin", method = RequestMethod.POST)
public String addAdmin(@Valid @ModelAttribute("user") User user,
BindingResult result, Model model) {
if (result.hasErrors()) {
return "admin/addadmin";
} else {
userService.createUser(user);
user = userService.findByUsername(user.getUsername());
UserRole userRole = new UserRole("ROLE_ADMIN");
userRole.setUser(user);
userRoleService.createUserRole(userRole);
return "redirect:/admin/adminlist";
}
}
当我尝试发送空公式时,我应该得到错误消息result.hasErrors()
,不返回错误,我的应用程序转到其他并尝试保存用户。为什么@Valid不起作用?
9条答案
按热度按时间3z6pesqy1#
在将我的项目升级到Sping Boot 2.3.0之后,我为同样的问题挣扎了几个小时,直到我意识到从#19550开始,Web和WebFlux启动器在默认情况下不再依赖于验证启动器。如果您的应用程序正在使用验证特性,您需要在构建文件中手动添加回对
spring-boot-starter-validation
的依赖。w1jd8yoj2#
我在 Boot 项目中遇到过同样的问题。
f45qwnt83#
您确定验证不起作用吗?除非您注册了
StringTrimmerEditor
,否则当您提交表单时,您的字段实际上是长度等于0的String示例,而不是null
值,因此注解会认为这些值是有效的。如果你想验证String不是空的(不是null也不是空的String),可以使用
@NotBlank
注解,而且我自己也试过了,@Email
注解也通过了空的String,这意味着你的空表单现在是有效的。j2qf4p5b4#
我遇到了同样的错误(应用程序未验证)。
我补充道
而且成功了!
lxkprmvk5#
我在2.5.0(SNAPSHOT)Sping Boot 项目中遇到了同样的问题。我在pom. xml文件中添加了下面的依赖项,它工作了。
whhtz7ly6#
我在Kotlin中遇到了同样的问题,旧的bean从Java自动转换过来,它们缺少
field
目标说明符,没有它javax.validation
注解就没有任何效果。问题代码的Kotlin片段(使用
field
解决问题):9njqaruj7#
检查是否在dispatcher-servlet.xml中声明了上述标记。此标记将在所有注解中处于活动状态。
xghobddn8#
今天(2018-04-22),hibernate-validator已经更新到6.0.9.Final版本,在我的测试中,我发现使用**@Valid的嵌套对象有效,可以工作〈= version5.2.5.Final**,我不明白为什么最新版本不能工作(也许以后有人可以解释),下面是我的代码:
在SpringMVC控制器上:
xpszyzbs9#
我不得不更改休眠验证器的版本。在8.0.0版本下不起作用,但在6.1.5版本下起作用。