springboot validator 验证器


springboot validator 验证器

 

 

**********************

相关类与接口

 

Validator:spring 提供接口,可对类进行验证

public interface Validator {

	boolean supports(Class<?> clazz);             //验证的类
	void validate(Object target, Errors errors);  //自定义验证规则
}

 

DataBinder

public class DataBinder implements PropertyEditorRegistry, TypeConverter {

	public static final String DEFAULT_OBJECT_NAME = "target";
	public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
	protected static final Log logger = LogFactory.getLog(DataBinder.class);

	private final Object target;
	private final String objectName;

	private AbstractPropertyBindingResult bindingResult;
	private SimpleTypeConverter typeConverter;

	private boolean ignoreUnknownFields = true;
	private boolean ignoreInvalidFields = false;
	private boolean autoGrowNestedPaths = true;

	private String[] allowedFields;
	private String[] disallowedFields;
	private String[] requiredFields;

	private ConversionService conversionService;
	private MessageCodesResolver messageCodesResolver;
	private BindingErrorProcessor bindingErrorProcessor = new DefaultBindingErrorProcessor();
	private int autoGrowCollectionLimit = DEFAULT_AUTO_GROW_COLLECTION_LIMIT;

	private final List<Validator> validators = new ArrayList<>();



**************
构造函数

	public DataBinder(@Nullable Object target) {
	public DataBinder(@Nullable Object target, String objectName) {


**************
普通方法

	public boolean isAutoGrowNestedPaths() {

	public Object getTarget() {
	public String getObjectName() {
	public int getAutoGrowCollectionLimit() {

	public void setAutoGrowNestedPaths(boolean autoGrowNestedPaths) {
	public void setAutoGrowCollectionLimit(int autoGrowCollectionLimit) {

	public void initBeanPropertyAccess() {
	public void initDirectFieldAccess() {


***********
验证器

	public void setValidator(@Nullable Validator validator) {
	public void addValidators(Validator... validators) {
	public void replaceValidators(Validator... validators) {

	public Validator getValidator() {
	public List<Validator> getValidators() {

	private void assertValidators(Validator... validators) {


***********
格式化器

	public void addCustomFormatter(Formatter<?> formatter) {
	public void addCustomFormatter(Formatter<?> formatter, String... fields) {
	public void addCustomFormatter(Formatter<?> formatter, Class<?>... fieldTypes) {


***********
自定义编辑器

	public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
	public void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String field, PropertyEditor propertyEditor) {

	public PropertyEditor findCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath) {


***********
convertIfNecessary操作

	public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType) throws TypeMismatchException {
	public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType,
			@Nullable MethodParameter methodParam) throws TypeMismatchException {
	public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType, @Nullable Field field)
			throws TypeMismatchException {
	public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType,
			@Nullable TypeDescriptor typeDescriptor) throws TypeMismatchException {



	public BindingResult getBindingResult() {
	public void bind(PropertyValues pvs) {
	protected void doBind(MutablePropertyValues mpvs) {


	public boolean isIgnoreInvalidFields() {
	public boolean isIgnoreUnknownFields() {

	public void setIgnoreUnknownFields(boolean ignoreUnknownFields) {
	public void setIgnoreInvalidFields(boolean ignoreInvalidFields) {
	public void setAllowedFields(@Nullable String... allowedFields) {
	public void setDisallowedFields(@Nullable String... disallowedFields) {
	public void setRequiredFields(@Nullable String... requiredFields) {

	public String[] getAllowedFields() {
	public String[] getDisallowedFields() {
	public String[] getRequiredFields() {


	public void setMessageCodesResolver(@Nullable MessageCodesResolver messageCodesResolver) {
	public void setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor) {
	public void setConversionService(@Nullable ConversionService conversionService) {

	public BindingErrorProcessor getBindingErrorProcessor() {
	public ConversionService getConversionService() {


	public void validate() {
	public void validate(Object... validationHints) {
	public Map<?, ?> close() throws BindException {


	protected void checkAllowedFields(MutablePropertyValues mpvs) {
	protected boolean isAllowed(String field) {
	protected void checkRequiredFields(MutablePropertyValues mpvs) {
	protected void applyPropertyValues(MutablePropertyValues mpvs) {

	protected AbstractPropertyBindingResult createBeanPropertyBindingResult() {
	protected AbstractPropertyBindingResult createDirectFieldBindingResult() {
	protected AbstractPropertyBindingResult getInternalBindingResult() {
	protected ConfigurablePropertyAccessor getPropertyAccessor() {
	protected SimpleTypeConverter getSimpleTypeConverter() {
	protected PropertyEditorRegistry getPropertyEditorRegistry() {
	protected TypeConverter getTypeConverter() {

 

 

**********************

示例

 

*****************

pojo 层

 

Order

@Data
public class Order {

    private String orderId;
    private Double price;
    private Integer amount;
    private Double totalFee;
}

 

*****************

config 层

 

CustomValidatior

public class CustomValidator implements Validator {

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

    @Override
    public void validate(Object target, Errors errors) {
        Order order=(Order)target;

        if (Math.abs(order.getTotalFee()-order.getPrice()*order.getAmount())>0.01){
            errors.rejectValue("totalFee","totalFeeError","totalFee 与 price*amount 相差超过 0.01");
        }
    }
}

 

*****************

controller 层

 

HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(@Validated Order order, BindingResult result){
        System.out.println(order);

        if (result.hasErrors()){
            result.getAllErrors().forEach(error -> {
                System.out.print("field:"+error.getObjectName()+"  "+error.getCode());
                System.out.println(" ==> message:"+error.getDefaultMessage());
            });
        }

        return "success";
    }

    @InitBinder
    private void bind(DataBinder binder){
        binder.setValidator(new CustomValidator());
    }
}

 

 

**********************

示例

 

localhost:8080/hello?orderId=1&price=2&amount=8&totalFee=8

2020-07-15 21:19:00.890  INFO 14568 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-07-15 21:19:00.898  INFO 14568 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
Order(orderId=1, price=2.0, amount=8, totalFee=8.0)
field:order  totalFeeError ==> message:totalFee 与 price*amount 相差超过 0.01

自定义验证规则设置成功

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值