我想使用Springboot的

问题描述 投票:0回答:1
import jakarta.validation.Valid; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController class FieldValidationController { @PostMapping("/validate") String question(@Valid @RequestBody SomeRequest someRequest) { return "please validate the field only if a property is on"; } }

import jakarta.validation.constraints.NotNull;

record SomeRequest(

    @NotEmpty
    String alwaysValidateMe,
    
    //How can I validate this property against @NotEmpty based on a property? 
    String onlyVaidateMeIfIamConfigured

) {
}

application.properties

validate.field.onlyVaidateMeIfIamConfigured=true #to have the possibility between validate.field.onlyVaidateMeIfIamConfigured=true and validate.field.onlyVaidateMeIfIamConfigured=false

仅在属性打开时才在字段上执行验证?
    
要根据应用程序属性值验证字段,似乎没有选项,除了创建自定义约束注释和相应的约束验证器。它的外观:

record SomeRequest( @NotEmpty(message = "Please enter the title") String title, @ConditionalNotEmpty(property = "validate.isEmpty") // in properties it will be validate.isEmpty=true String string) { }
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = ConditionalNotEmptyStringValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConditionalNotEmpty {
    String property();
    
    String message() default "Field is invalid";

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

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

和验证器:
java spring spring-boot spring-validator spring-validation
1个回答
0
投票
import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import org.springframework.core.env.Environment; public class ConditionalNotEmptyStringValidator implements ConstraintValidator<ConditionalNotEmpty, String> { private final Environment environment; // autowire to get property value private String propertyKey; public ConditionalNotEmptyStringValidator(Environment environment) { this.environment = environment; } @Override public void initialize(ConditionalNotEmpty constraintAnnotation) { this.propertyKey = constraintAnnotation.property(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { boolean isValidationEnabled = Boolean.parseBoolean(environment.getProperty(this.propertyKey, "false")); // find validate.isEmpty value in properties, if not found - false if (isValidationEnabled) { return value != null && !value.isEmpty(); } else { return true; } } }


最新问题
© www.soinside.com 2019 - 2024. All rights reserved.