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 {};
}
和验证器:
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;
}
}
}