valida校驗關聯(lián)參數(shù)、指定屬性值

一、自定義校驗規(guī)則

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * title:   商品屬性校驗
 *
 * @author: hetao
 * Date:     2020/1/9 16:29
 */
public class AttributeValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass) {
        return AttributeInsertCommand.class.equals(aClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        //把校驗信息注冊到Error的實現(xiàn)類里
        AttributeInsertCommand attribute = (AttributeInsertCommand) obj;
        AttributeInputEnum inputEnum = AttributeInputEnum.ELECTION;
        List<AttributeValue> attributeValue = attribute.getAttributeValue();
        List<String> collect = attributeValue.stream().map(AttributeValue::getValue).filter(Objects::nonNull).collect(Collectors.toList());

        if (attribute.getAttrInputType() == inputEnum.getCode() && collect.size() == 0) {
            errors.rejectValue("attributeValue", null, "輸入方式為" + inputEnum.getMsg() + "時,屬性值必填");
        }
    }
}

二、請求實體

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.List;

/**
 * title:    商品屬性新增
 * Date:     2019/12/31 13:31
 *
 * @author hetao
 */
@Data
@ApiModel("商品屬性新增")
public class AttributeInsertCommand implements Serializable {

    private static final long serialVersionUID = -6273001214036704660L;

    /**
     * 屬性名稱
     */
    @ApiModelProperty("屬性名稱")
    @NotEmpty(message = "屬性名稱不能為空")
    private String attrName;

    /**
     * 狀態(tài), 1:啟用   0:禁用
     */
    @ApiModelProperty("狀態(tài),1:啟用,0:禁用")
    @EnumValue(intValues = {1, 0})
    private Integer status;

    /**
     * 屬性輸入類型 1:下拉框 2:文本
     */
    @ApiModelProperty("屬性輸入類型,1:下拉框 2:文本")
    @EnumValue(intValues = {1, 2})
    private Integer attrInputType;

    /**
     * 屬性描述
     */
    @ApiModelProperty("屬性值數(shù)組")
    private List<AttributeValue> attributeValue = Lists.newArrayList();

}

三、controller

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

/**
 * Date:     2020/1/2 10:09
 * title:title
 *
 * @author hetao
 */
@RestController
@RequestMapping("/api/attribute")
@Api(value = "屬性管理", tags = "屬性管理")
public class AttributeController {

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.addValidators(new AttributeValidator());
    }

 /**
     * 商品屬性新增
     *
     * @param attributeInsertCommand 商品屬性新增
     * @return JsonResult
     */
    @PostMapping
    @ApiOperation("商品屬性新增")
    public JsonResult<Boolean> addAttribute(@RequestBody @Valid AttributeInsertCommand attributeInsertCommand, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            JsonResult<Boolean> jsonResult = JsonResult.create(Integer.parseInt(ResultEnum.APP_VALIDATION_ERROR.getCode()), fieldError.getDefaultMessage(), false);
            return jsonResult;
        }
        return JsonResult.create(attributeService.addAttribute(attributeInsertCommand));
    }
}

三、自定義EnumValue注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * title:    校驗指定值
 *
 * @author: hetao
 * Date:     2020/1/9 16:59
 */
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValueValidator.class})
public @interface EnumValue {

    //默認錯誤消息
    String message() default "必須為指定值";

    String[] strValues() default {};

    int[] intValues() default {};

    //分組
    Class<?>[] groups() default {};

    //負載
    Class<? extends Payload>[] payload() default {};

    //指定多個時使用
    @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        EnumValue[] value();
    }
}

注解實現(xiàn)

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * title:   自定義枚舉校驗
 *
 * @author: hetao
 * Date:     2020/1/9 17:00
 */
public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {

    private String[] strValues;
    private int[] intValues;

    @Override
    public void initialize(EnumValue constraintAnnotation) {
        strValues = constraintAnnotation.strValues();
        intValues = constraintAnnotation.intValues();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value instanceof String) {
            for (String s : strValues) {
                if (s.equals(value)) {
                    return true;
                }
            }
        } else if (value instanceof Integer) {
            for (Integer s : intValues) {
                if (s == value) {
                    return true;
                }
            }
        }
        return false;
    }
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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