在Spring MVC中使用注解的方式校验RequestParams

概述

  Spring MVC支持Bean Validation,通过这个验证技术,可以通过注解方式,很方便的对输入参数进行验证,之前使用的校验方式,都是基于Bean对象的,但是在@RequestParam中,没有Bean对象,这样使得校验无法进行,可以通过使用@Validated注解,使得校验可以进行。

校验bean对象

  一般校验bean对象,为了可以自动的校验属性,可以通过两步解决:

一、声明对象

package com.github.yongzhizhan.draftbox.model;

import javax.validation.constraints.Size;

/**
 * 带验证的对象
 * @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注解使用对象

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

    return vFoo.getValidString();
}

校验RequestParams

  使用校验bean的方式,没有办法校验RequestParam的内容,一般在处理Get请求的时候,会使用下面这样的代码:

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

    return vStr;
}

使用@Valid注解,对RequestParam对应的参数进行注解,是无效的,需要使用@Validated注解来使得验证生效。操作步骤如下:

一、声明错误处理类

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并加上校验注解

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 技术规范特性概述 Validation, Data Binding, and Type Conversion

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

警方通报空姐遇害!滴滴100万悬赏嫌疑司机!请转发找凶手!

5月10日晚23:17,平安郑州发布关于空姐李明珠搭乘滴滴顺风车遇害案的警情通报!

1313
来自专栏程序员互动联盟

黑程序员最狠的十句话

1. 今天去买了几箱水果,结账一共260元。我说:“都是老顾客了,零头就抹了吧。”老板也很爽快:“行,凑个整,你给256块吧。”我顿时肃然起敬:“您以前当过程序...

3477
来自专栏TEG云端专业号的专栏

【腾讯AI LAB出品】日漫风的腾讯大楼,静守时光,以待流年

渐渐地,残星闭上昏昏欲睡的眼睛,在晨空中隐隐作退,夜空似藏青色的帷幕,点缀着闪闪繁星,让人不由深深地沉醉。AI Lab 出品的视频滤镜和新海诚滤镜,便是聚光灯下...

3495
来自专栏吉浦迅科技

NVIDIA GPU 助信息安全厂商免除惡意程式攻擊

電腦和行動裝置上的惡意軟體程式日漸增加,對於信息安全業界造成嚴重問題,由於資料量過於龐大,現時有部份公司陸續開始利用 NVIDIA GPU 解決惡意軟體的問題,...

3366
来自专栏区块链大本营

冻结黑客账户!6万EOS被盗的最新仲裁结果出来了

近期大热的EOS版狼人杀遭遇黑客攻击,60686.4190个EOS被盗,上线不到2天的EOS狼人游戏被迫停服。

492
来自专栏Python专栏

有时间BB,不如想想怎么让别人闭嘴吧

经过上次「SKR!虎扑66万JRS大战3300万吴亦凡护卫队,别逼我拿Python」一事,我发现观众里有很多JRs,「这就是灌篮」一定不陌生。

993
来自专栏小狼的世界

惊闻NBC在奥运后放弃使用Silverlight

奥运初始的时候,媒体对于NBC使用Silverlight技术进行了高调的宣传,没想到奥运会结束刚刚三周的时间,NBC就弃用了Siverlight,重新采用Ado...

982
来自专栏吉浦迅科技

GDC 2015 NVIDIA首度展示TITAN X GPU

NVIDIA 於剛結束的 2015 年 GDC 遊戲開發者大會上發表稱為「 Thief in the Shadows 」的嶄新虛擬實境體驗內容,「 Thief ...

2667
来自专栏程序员互动联盟

只有程序员能看懂的笑话

1. 某程序员退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。定神片刻,泼墨挥毫,郑重地写下一行字:hello wo...

3325
来自专栏龙行天下CSIEM

科学瞎想系列之五 所谓的微风发电是个伪命题

随着新能源的火爆,风力发电也成为近年来各国研究的热点。于是众多民科也纷纷揭竿而起掺和进来凑热闹,"发明"了许多奇葩"专利"。"微风发电"就是民科的一个忽...

36010

扫码关注云+社区