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注释。