给前端传入的请求体中值为的 null 的字段设置默认值

237人浏览 / 0人评论

参考

https://www.jb51.net/program/285444al2.htm

自定义注解 @DefaultValue

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

/**
 * @Author FengHao
 * @Date 2024/8/7
 * @Description:
 **/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = DefaultValueValidator.class)
public @interface DefaultValue {
    boolean isClass() default false;
    String value() default "";
    String message() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

校验类 DefaultValueValidator.class

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Field;

/**
 * @Author FengHao
 * @Date 2024/8/7
 * @Description:
 **/
public class DefaultValueValidator implements ConstraintValidator<DefaultValue, Object> {
    private boolean isClass = false;

    @Override
    public void initialize(DefaultValue constraintAnnotation) {
        isClass = constraintAnnotation.isClass();
    }

    @Override
    public boolean isValid(Object obj, ConstraintValidatorContext context) {
        if (obj == null || !isClass) {
            return true;
        }
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(DefaultValue.class)) {
                DefaultValue defaultValue = field.getAnnotation(DefaultValue.class);
                String value = defaultValue.value();
                field.setAccessible(true);
                try {
                    Object fieldValue = field.get(obj);
                    if (fieldValue != null && !fieldValue.equals("")) {
                        continue;
                    }
                    String fieldType = field.getType().getSimpleName();
                    switch (fieldType) {
                        case "String":
                            field.set(obj, value);
                            break;
                        case "Integer":
                            field.set(obj, Integer.valueOf(value));
                            break;
                        case "Long":
                            field.set(obj, Long.valueOf(value));
                            break;
                        case "Boolean":
                            field.set(obj, Boolean.valueOf(value));
                            break;
                        case "Double":
                            field.set(obj, Double.valueOf(value));
                            break;
                        default:
                    }
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return true;
    }
}

使用示例

实体类

@Data
@DefaultValue(isClass = true)
public class MyTest {

    @DefaultValue(value = "123")
    private Integer code;

    @DefaultValue(value = "123456")
    private Long userId;

    @DefaultValue(value = "false")
    private Boolean delete;

    @DefaultValue(value = "99999.99")
    private Double money;

    @DefaultValue(value = "0")
    private String state = "0";
}

控制类

@PostMapping(value = "/test")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity<Object> censusAddAll(@Validated @RequestBody MyTest mytest) {
    System.out.println("mytest = " + mytest);
    return new ResponseEntity<>(mytest, HttpStatus.OK);
}

全部评论