请求参数校验,在实际的应用中很常见,网上的文章大部分提供的使用注解的方式做参数校验。本文主要介绍 spring webflux function endpoint 使用 spring validation 来校验请求的参数。使用上一篇文章的示例来演示。

使用步骤如下:

1.创建校验器 validator

2.运用校验器

3.抛出异常,返回 http status 400 错误

personvalidator.java

package com.example.springbootdemo.webflux.restful;

import org.springframework.stereotype.component;
import org.springframework.validation.errors;
import org.springframework.validation.validationutils;
import org.springframework.validation.validator;

@component
public class personvalidator implements validator {

  @override
  public boolean supports(class<?> clazz) {
    return person.class.isassignablefrom(clazz);
  }

  // 校验参数的方法
  @override
  public void validate(object o, errors errors) {
    validationutils.rejectifempty(errors, "name", "name.required");
    validationutils.rejectifempty(errors, "age", "age.required");
    person p = (person) o;
    if (p.getage() != null && p.getage() < 0) {
      errors.rejectvalue("age", "negative.value");
    } else if (p.getage() != null && p.getage() > 200) {
      errors.rejectvalue("age", "too.old");
    }
  }
}

校验器在 saveperson 方法中的使用

@slf4j
@component
public class personhandler {

  @autowired
  private personrepository repository;
  @autowired
  private personvalidator validator;

  public mono<serverresponse> saveperson(serverrequest request) {
    mono<person> personmono = request.bodytomono(person.class).doonnext(this::validate);
    return serverresponse.ok().contenttype(mediatype.application_json)
        .body(this.repository.saveperson(personmono), void.class);
  }
    
  public void validate(person person) {
    errors errors = new beanpropertybindingresult(person, person.class.getname());
    validator.validate(person, errors);
    if (errors.haserrors()) {
        // 抛出 http status 400 异常
      throw new serverwebinputexception(errors.tostring());
    }
  }
    // .... 省略
}

请求效果:

官方校验参数示例的地址

使用 spring 官方文档提供的示例不会抛出 http code 400 错误,返回的是http code 为 200。

接下来,我们来看一下validator 接口中的两个方法 supportsvalidate

  • supports(class) : 判断当前的校验器用指定的类上。
  • validate(object, org.springframework.validation.errors) : 校验给定的对象,如果出现错误,就给errors 注册 error 信息。

另外,spring 还提供了非常好用的 validationutils 的工具类,提供了静态的方法

  • rejectifempty
  • rejectifemptyorwhitespace

全局异常的使用

@configuration
@slf4j
public class globalerrorconfig {

  private objectmapper objectmapper = new objectmapper();

  @bean
  @order(-2)
  public webexceptionhandler exceptionhandler() {
    return (serverwebexchange serverwebexchange, throwable t) -> {
      databuffer databuffer = serverwebexchange.getresponse().bufferfactory().allocatebuffer();
      result result = new result();
      if (t instanceof serverwebinputexception) {
        serverwebinputexception exception = (serverwebinputexception) t;
        result.setcode(exception.getstatus().value());
        result.setmessage(exception.getreason());
      } else {
        result.setcode(httpstatus.internal_server_error.value());
        result.setmessage(httpstatus.internal_server_error.tostring());
      }
      try {
        databuffer.write(objectmapper.writevalueasbytes(result));
      } catch (jsonprocessingexception e) {
        log.error(nestedexceptionutils.buildmessage("write error", e));
      }
      serverhttpresponse response = serverwebexchange.getresponse();
      response.setrawstatuscode(result.getcode());
      return response.writewith(mono.just(databuffer));
    };
  }
}

result.java

import lombok.getter;
import lombok.setter;

@getter
@setter
public class result {

  private integer code;

  private string message;
}

请求效果:

至此,webflux 的function endpoint 的参数校验的使用结束了。

参考:

webflux handler validation

spring validator

到此这篇关于spring webflux实现参数校验的示例代码的文章就介绍到这了,更多相关spring webflux 参数校验内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!