在Spring MVC中使用注解的方式校驗(yàn)RequestParams

概述

Spring MVC支持Bean Validation,通過這個(gè)驗(yàn)證技術(shù),可以通過注解方式,很方便的對(duì)輸入?yún)?shù)進(jìn)行驗(yàn)證,之前使用的校驗(yàn)方式,都是基于Bean對(duì)象的,但是在@RequestParam中,沒有Bean對(duì)象,這樣使得校驗(yàn)無法進(jìn)行,可以通過使用@Validated注解,使得校驗(yàn)可以進(jìn)行。

校驗(yàn)bean對(duì)象

一般校驗(yàn)bean對(duì)象,為了可以自動(dòng)的校驗(yàn)屬性,可以通過兩步解決:

一、聲明對(duì)象

package com.github.yongzhizhan.draftbox.model;

import javax.validation.constraints.Size;

/**
 * 帶驗(yàn)證的對(duì)象
 * @author zhanyongzhi
 */
public class Foo {
    private String validString;

    @Size(min = 1, max = 5)
    public String getValidString() {
        return validString;
    }

    public void setValidString(final String vValidString) {
        validString = vValidString;
    }
}

二、通過@Valid注解使用對(duì)象

@ResponseBody
@RequestMapping(value = "validObject", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public String validObject(
        @RequestBody()
        @Valid Foo vFoo, BindingResult vBindingResult){

    return vFoo.getValidString();
}

校驗(yàn)RequestParams

使用校驗(yàn)bean的方式,沒有辦法校驗(yàn)RequestParam的內(nèi)容,一般在處理Get請(qǐng)求的時(shí)候,會(huì)使用下面這樣的代碼:

@ResponseBody
@RequestMapping(value = "validString", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public String validString(
        @RequestParam(value = "str", defaultValue = "")
        String vStr){

    return vStr;
}

使用@Valid注解,對(duì)RequestParam對(duì)應(yīng)的參數(shù)進(jìn)行注解,是無效的,需要使用@Validated注解來使得驗(yàn)證生效。操作步驟如下:

一、聲明錯(cuò)誤處理類

package com.github.yongzhizhan.draftbox.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.validation.ValidationException;

@ControllerAdvice
@Component
public class GlobalExceptionHandler {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handle(ValidationException exception) {
        System.out.println("bad request, " + exception.getMessage());
        return "bad request, " + exception.getMessage();
    }
}

二、聲明@Validated并加上校驗(yàn)注解

package com.github.yongzhizhan.draftbox.controller;

import com.github.yongzhizhan.draftbox.model.Foo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.Size;

@RestController
@SuppressWarnings("UnusedDeclaration")
@Validated
public class IndexController {
    @ResponseBody
    @RequestMapping(value = "validString", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    public String validString(
            @RequestParam(value = "str", defaultValue = "")
            @Size(min = 1, max = 3)
            String vStr){

        return vStr;
    }
}

代碼

在github中查看完整代碼

參考

Bean Validation 技術(shù)規(guī)范特性概述
Validation, Data Binding, and Type Conversion

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容