spring mvc + @Valid + @RequestBody 接收json同时校验javaBean的数据有效性

1. 起因:
    半路接手的项目,原使用spring 3.1.0.CI-995(不知道当时怎么设计的,使用了这么一个过渡版本),但是现在想用注解来验证数据的有效性,正常情况下,使用@Valid验证也没有什么问题,但是现在有一个需求就是接收json后,验证对象的数据有效性,这时后台出错。

2. 解决方法
    spring 3.1.0.CI-995 升级到 3.1.0.RELEASE。版本升级过程中也不是很顺利,调了很长时间才通过,过渡版本到正式版也有很多差异的地方。

2. 普通验证
JavaBean
public class Message{

    @NotEmpty(message = "Message name must not be blank!")
    private String name;

    @NotBlank(message = "Message description must not be blank!")
    private String description;

    public Message() {
    }

    public Message(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}


Controller
@RequestMapping("/sender/message")
	@ResponseBody
	public ResponseBean sendMessage(@Valid Message messageBean, BindingResult bindingResult){

		......

		if (bindingResult.hasErrors()) {
			System.out.println("验证失败!");
		}
		......
}

注意:BindingResult 对象必须在 @Valid 的紧挨着的后面,否则接收不到错误信息。

3. 接收json的验证
Controller
方法1:
@RequestMapping("/sender/message")
	@ResponseBody
	public ResponseBean sendMessage(@Valid @RequestBody Message messageBean, BindingResult bindingResult){
		......

		if (bindingResult.hasErrors()) {
			System.out.println("验证失败!");
		}
		......
}

上面这种方式在spring3.2.x中没有试过,在3.1.0.RELEASE中是出错的。如果上面这种出错,可以使用下面方法。

方法2:
@RequestMapping("/sender/message")
	@ResponseBody
	public ResponseBean sendMessage(@Valid @RequestBody Message messageBean){
		......

		......
}

在此Controller中添加如下方法:

使用@ExceptionHandler捕获错误信息:
	// valid exception
	@ExceptionHandler(MethodArgumentNotValidException.class)
	@ResponseBody
	public ResponseBean handleMethodArgumentNotValidException(
			MethodArgumentNotValidException ex) {
		BindingResult bindingResult = ex.getBindingResult();
		String errorMesssage = "Invalid Request:";

		for (FieldError fieldError : bindingResult.getFieldErrors()) {
			errorMesssage += fieldError.getDefaultMessage() + ", ";
		}
		
		System.out.println(bindingResult.getFieldError().getDefaultMessage());
		ResponseBean response = new ResponseBean();
		response.setErrcode("-11");
		response.setErrmsg(errorMesssage);
		return response;
	}

	// JSON convert exception
	@ExceptionHandler(HttpMessageNotReadableException.class)
	@ResponseBody
	public ResponseBean handleHttpMessageNotReadableException(
			HttpMessageNotReadableException ex) {
		ResponseBean response = new ResponseBean();
		response.setErrcode("-22");
		response.setErrmsg("json convert failure!");
		return response;
	}


注意:MethodArgumentNotValidException 类,在spring 3.1.0.RELEASE 版本之后才有。

转载请注明: http://langmnm.iteye.com/blog/2078439

你可能感兴趣的:(spring,@RequestBody,spring-mvc,@Valid)