Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bean验证以检查几个整数值中的一个_Java_Integer_Bean Validation - Fatal编程技术网

Java Bean验证以检查几个整数值中的一个

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”)//约束

使用版本2或版本3,我如何检查
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;