【问题标题】:Java Validation constraint of enum + subtype枚举+子类型的Java验证约束
【发布时间】:2019-09-19 23:21:30
【问题描述】:

我正在尝试使用 Java 验证约束(@NonNull、@Min 等)改进和简化我的部分代码,但在我的代码中有一个反复出现的情况,我无法弄清楚如何使用约束注释。

这是一个例子:

public class ResourceIdentifier {
    public enum ResourceType { ARTICLE, USER, COMMENT }

    private @Getter @Setter String id;
    private @Getter @Setter ResourceType type;
}

然后我想验证 MyCommand 对象,所以 resourceId 不为空,resourceId.type 只能是 ARTICLECOMMENT

public class MyCommand {
    @NotNull
    @Validate(path="#resourceId.type", values={ResourceIdentifier.ResourceType.ARTICLE, ResourceIdentifier.ResourceType.COMMENT})
    private ResourceIdentifier resourceId;

    (...)
}

我相信我可以通过自定义约束验证注释和反射来实现这一点。

还有其他简单的方法吗?

编辑:假设我有 10-20 个其他命令类需要类型相同的验证 resourceId.type = {}

【问题讨论】:

  • 这是lombok 还是其他框架?你可能想这样标记它。
  • 你没有提到你得到了什么错误或你的程序有什么其他问题。但是这些值不应该是实际的枚举吗? ResourceIdentifier.ResourceType.ARTICLE 等?
  • 好点@RealSkeptic。我更新了问题。我没有任何错误,我只是想知道实现@Validate 注释的最有效方法是什么。

标签: java validation enums


【解决方案1】:

您可以只使用断言约束(这是MyCommand 中的一个方法):

@AssertTrue(message="Only Comment and Article are allowed as resource type")
public boolean isResourceIdValid() {
   return this.resourceId.getType() == ResourceIdentifier.ResourceType.ARTICLE 
          || this.resourceId.getType() == ResourceIdentifier.ResourceType.COMMENT;
}

【讨论】:

  • 谢谢,但主要问题是我有 50 个不同的命令,超过 10 个有约束 resourceId.type = {enum}。我想知道如何利用约束注释来避免代码重复。
  • 您可能想要实现一个自定义验证器,但这不会消除在每个类上声明元数据的需要,除非您(可能)在一个通用(可能是抽象的)超类中声明约束并使该超类使用通过重写方法获得的字段值。无论哪种方式,您都需要重复约束声明,或者您必须声明一些其他枚举/数据结构,将命令类型映射到它们各自的资源类型集。 IMO,断言方法更容易测试和维护......但这取决于你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 2021-09-23
相关资源
最近更新 更多