Spring验证和@Valid

时间:2015-01-11 12:21:53

标签: java spring validation

我有控制器的方法:

@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字符串有效!怎么了?在错误消息中,我们可以看到rejected value [asd];。为什么呢?

2 个答案:

答案 0 :(得分:4)

Bean验证未指定对字符串使用@Max。来自休眠验证documentation

  

Hibernate Validator允许将一些约束应用于比Bean Validation规范所要求的更多数据类型(例如,@ Max可以应用于字符串)。依赖此功能可能会影响Bean验证提供程序之间的应用程序的可移植性。

因此,请尝试使用@Size,以便遵守所有提供商:

@Column
@Size(max=5)
private String name;

答案 1 :(得分:3)

@Max代表数字。您应该使用@Size来验证字符串长度。