【问题标题】:How to specify length of id in Redis如何在 Redis 中指定 id 的长度
【发布时间】:2018-02-19 12:45:39
【问题描述】:

如何在我的 Spring Boot Rest 应用程序中使用 Redis 指定 15-25 个符号的“ID”长度约束?

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  private Long id;

  @Indexed
  private Status status;
}

更新

我尝试将id 类型更改为String 并设置Size 以限制符号长度,但在Redis db 使用范围内不起作用(似乎Size 注释被忽略):

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  @Size(min = 15, max = 25)
  private String id;

  @Indexed
  private Status status;
}

我也尝试过使用自定义验证器,并且行为相同 - 使用 Redis db 时似乎它被忽略了:

@Documented
@Constraint(validatedBy = DigitsLimitValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DigitsLimit {

  String message() default "Digits length is too short or long";

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

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

  int min() default 5;

  int max() default 15;

}

验证器:

public class DigitsLimitValidator implements ConstraintValidator<DigitsLimit, BigInteger> {

  private int min;
  private int max;

    @Override
    public void initialize(DigitsLimit value) {
      min = value.min();
      max = value.max();
    }

    @Override
    public boolean isValid(BigInteger value, ConstraintValidatorContext cxt) {
      return value != null && BigIntegerMath.log10(value, RoundingMode.FLOOR) + 1 >= min && BigIntegerMath.log10(value, RoundingMode.FLOOR) + 1 <= max;
    }

  }

型号:

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  @DigitsLimit(min = 15, max = 25)
  private BigInteger id;

  @Indexed
  private Status status;
}

在调试模式下,我无法在验证器中捕获任何断点。

在这两种尝试中,我都可以保存任意长度的数字。限制被忽略。为什么会被忽略?

【问题讨论】:

    标签: java spring-boot redis spring-data-redis


    【解决方案1】:

    如何从 15-25 个符号中指定“ID”的长度限制

    使用Long 类型是没有意义的,因为Long.MAX_VALUE“只有”19 位数字。

    9223372036854775807

    要包含这样的值,BigInteger 可能是更好的选择。

    您无法将@Min@Max 注释添加到BigInteger 字段,因为值限制在Long 范围内。所以你不能代表 25 位数字。

    所以你有两种方法:

    • 创建a custom validator 以确保您的约束得到遵守。

    • 将数值替换为String。您可以使用不适用于数字字段但适用于 CharSequence 字段(例如 String)的 javax.validation.constraints.Size 注释。

    例如:

    @Id
    @Size(min=15, max=25)
    private String id;
    

    【讨论】:

    • 谢谢!但是在 15-25 个符号的情况下如何限制 BigInteger?
    • 我想生成 15 个符号的 id,允许的最大符号为 25 个
    • 不客气。它不能与BigInteger 一起使用。我用两种方式编辑。
    • 哦,谢谢。如果我选择基于 BigInteger 字段的自定义验证器,我如何计算该字段中的位数?除了我找到的解决方案之外,也许还有更优雅的方法来计算 BigInteger 值的位数 - stackoverflow.com/questions/18828377/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多