【问题标题】:Java8 Bean Validation for Enum type using Hibernate使用 Hibernate 对 Enum 类型进行 Java8 Bean 验证
【发布时间】:2018-05-06 05:38:06
【问题描述】:

这是我的情况,

我有一个带有Enum 类型字段的类。我想对enum 类型执行带注释的验证,类似于字符串的注释,例如:@Size@NotNull 等。

问题是,json 解串器在验证发生之前在 enum 类型上失败。

public class myClass {
    @JsonProperty
    //@SomeCustomValidator -- ??
    private EnumType enumValue;
}

public enum EnumType {
    A,
    B,
    C
}

几件事:

  1. 我不想将数据类型更改为String
  2. 尝试了以下线程中的步骤,没有解决我的问题。

    Tried this link, but get an error in deserialization before validation hits

    Tried this link, but it works only when data Type is String

【问题讨论】:

  • 所以如果你只在课堂上使用EnumType,你想验证谁?您想验证您的 EnumType enumValue 是否等于固定枚举或什么?

标签: java enums bean-validation hibernate-validator javax


【解决方案1】:

验证在参数类型被解析后起作用。所以我看不到如何在枚举上使用字符串验证注释。作为解决方法,您可以使用 @JsonCreator 并在创建对象之前进行一些验证。

public enum EnumType {
    A,
    B,
    C;

    @JsonCreator
    public static EnumType from(String s) {
        // add your logic here, for example
        /*
        if (Stream.of(values()).map(Enum::name).noneMatch(name -> name.equals(s))) {
            throw new MyServiceException("Bad value " + s);
        }
        */
        return valueOf(s);
    }
}

【讨论】:

  • 谢谢。这是一个很好的方法..,但除非我返回 null,否则任何逻辑都不起作用,在这种情况下不会发生异常并且将 null 值分配给字段。您有使用这种方法的有效解决方案吗?
  • 您可以抛出异常或返回 null 或您的枚举的任何实例。我认为您的目标是根据 json 中的字符串值抛出自定义异常。如果不是,我不知道您要达到的目标是什么。
猜你喜欢
  • 2014-04-11
  • 2018-04-10
  • 2017-11-24
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多