Java Spring验证和@Valid
我有控制器的方法:Java Spring验证和@Valid,java,spring,validation,Java,Spring,Validation,我有控制器的方法: @RequestMapping(value="/eusers", method=RequestMethod.POST) public @ResponseBody String createEUser(@Valid @RequestBody EUser e, BindingResult result){ if(result.hasErrors()){ return "error"; }
@RequestMapping(value="/eusers", method=RequestMethod.POST)
public @ResponseBody String createEUser(@Valid @RequestBody EUser e, BindingResult result){
if(result.hasErrors()){
return "error";
}
//EUser creation and adding to a DB
return "OK";
}
EUser.java如下所示:
@Entity
@Table(name="users")
public class EUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Max(5)
@Column(name="name")
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
问题是,在我收到验证错误消息的情况下,我甚至通过了包含少于5个字符asd的参数:
org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'euser' on field 'name': rejected value [asd];
codes [Max.user.name,Max.name,Max.java.lang.String,Max];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [euser.name,name];
arguments []; default message [name],5];
default message [must be less than or equal to 5]
但是asd字符串是有效的!发生了什么?在错误消息中,我们可以看到被拒绝的值[asd];。为什么?@Max代表数字。您应该使用来验证字符串长度。@Max表示数字。您应该使用来验证字符串长度。Bean验证没有指定使用@Maxfor字符串。从hibernate验证: Hibernate Validator允许将一些约束应用于比Bean验证规范所要求的更多的数据类型,例如@Max可以应用于字符串。依赖此功能可能会影响应用程序在Bean验证提供者之间的可移植性 因此,尝试使用@Size,如下所示,以符合所有提供商的要求:
@Column
@Size(max=5)
private String name;
Bean验证没有指定使用@Maxfor字符串。从hibernate验证: Hibernate Validator允许将一些约束应用于比Bean验证规范所要求的更多的数据类型,例如@Max可以应用于字符串。依赖此功能可能会影响应用程序在Bean验证提供者之间的可移植性 因此,尝试使用@Size,如下所示,以符合所有提供商的要求:
@Column
@Size(max=5)
private String name;
不要使用@Max进行字符串验证,尝试使用@Lengthmin=1、Max=5或@Sizemax=5注释。不要使用@Max进行字符串验证,尝试使用@Lengthmin=1、Max=5或@Sizemax=5注释。