Java Bean验证以检查几个整数值中的一个
使用版本2或版本3,我如何检查Java Bean验证以检查几个整数值中的一个,java,integer,bean-validation,Java,Integer,Bean Validation,使用版本2或版本3,我如何检查int或Integer成员字段是否有一组有限的值 对于一个简化的示例,考虑这表示一个具有容量为50或55的字段的桶。 记录桶( UUID id, int capacity//约束为50或55的值。 ) {} ➥ 我如何注释容量字段以确保其数值仅为50或55 如果capacity字段的类型为String,我可以将@Pattern与正则表达式一起使用 公共记录桶( @NotNull UUID id, @NotNull @模式(regexp=“50 | 55”)//约束
int
或Integer
成员字段是否有一组有限的值
对于一个简化的示例,考虑这表示一个具有容量为50或55的字段的桶。
记录桶(
UUID id,
int capacity//约束为50或55的值。
) {}
➥ 我如何注释容量
字段以确保其数值仅为50
或55
如果capacity
字段的类型为String
,我可以将@Pattern
与正则表达式一起使用
公共记录桶(
@NotNull
UUID id,
@NotNull
@模式(regexp=“50 | 55”)//约束为“50”或“55”的值。
串容量
) {}
运行它
package work.basil.example.beanval;
导入jakarta.validation.ConstraintViolation;
导入jakarta.validation.validation;
导入jakarta.validation.Validator;
进口jakarta.validation.validator工厂;
导入java.util.Set;
导入java.util.UUID;
公共类应用程序
{
公共静态void main(字符串[]args)
{
App App=新App();
app.demo();
}
私有void演示()
{
ValidatorFactory=Validation.buildDefaultValidatorFactory();
Validator Validator=factory.getValidator();
桶体=新桶体(UUID.来自管柱(“e78456ac-6f12-45ae-b8e1-c3b8193a920e”),“55”);
设置>违规=验证程序。验证(Barrel);
System.out.format(“信息-发现%d个冲突。\n”,冲突.size());
forEach(barrelConstraintViolation->System.out.println(barrelConstraintViolation.getMessage());
}
}
➥ 如何才能使
int
/整数
与字符串
获得相同的效果?我认为没有内置的验证器。尽管如此,构建自己的应用程序并不重要:
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target({FIELD,PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = OneOfValidator.class)
public @interface OneOf {
String message() default "...provide your default message here...";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
/** The array of allowed values. */
int[] value();
}
注意:对于像您这样的用例,
enum
是否更合适?我认为您需要编写自己的@Constraint
。这将使您的注释参数成为一个int[]
。我支持上面的注释-您必须自己编写它,而且它相当简单,我认为。我们有很多这样的自定义验证器。我的问题中的用例是为了简单而设计的。枚举将适用于此。我的实际用例需要比枚举提供更多的灵活性。感谢您的回答和示例代码。
import static java.util.stream.Collectors.toSet;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Set;
public class OneOfValidator implements ConstraintValidator<OneOf, Integer> {
private Set<Integer> allowedValues;
@Override
public void initialize(OneOf constraintAnnotation) {
allowedValues = Arrays.stream(constraintAnnotation.value()).boxed().collect(toSet());
}
@Override
public boolean isValid(Integer i, ConstraintValidatorContext constraintValidatorContext) {
return i == null || allowedValues.contains(i);
}
}
@OneOf({50,55})
int capacity;