在Pojo.name中添加验证规则以对象扩展Pojo?

问题描述 投票:0回答:1

我有一个简单的 java pojo,我将其提供给我的 Android 用户:

@XmlRootElement
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PostAccount {
    @Getter
    @Setter
    private String email;
    @Getter
    @Setter
    private String pass1;
    @Getter
    @Setter
    private String pass2;
}

这个pojo被序列化为json并发送到我的服务器。在我的服务器上,我使用 jersey bean 验证:

public NumberResult add(@Valid ValidAccount account) {

但是因为 Account pojo 没有任何验证注释,所以验证作用不大。

我可以创建第二个带有验证注释的 pojo 并在服务器端使用它:

public class ValidAccount {

    @Getter
    @Setter
    @NotEmpty
    @CheckEmail
    private String email;
    @Getter
    @Setter
    @NotBlank
    private String pass1;
    @Getter
    @Setter
    @NotBlank
    private String pass2;
}

工作完美。

但是当我现在在 Account pojo 添加一个字段时,我必须记住更改 ValidAccount pojo。没问题,但是当你有很多 pojo 的东西时,管理起来就会变得复杂。

有更好的解决办法吗?

例如,是否可以扩展 Account pojo 并以某种方式添加验证规则? (请我继续使用注释,xml 让我毛骨悚然)

java jersey bean-validation hibernate-validator
1个回答
0
投票

对于未来的读者:

一般来说,您可以在编译时提供一些关于您希望实体如何被验证的元信息,然后使用一些

jakarta-validation-api
验证引擎(Jeresy、Hiberate 等等),并且该引擎可以根据您提供的注释。创建同一实体的 2 个副本不仅乏味 - 而且容易出错,因此除非您有充分的理由,否则不要这样做(在本例中并非如此,请进一步阅读)。

如果没有注释,您需要自己编写验证,或者采用编程配置方法。它在某种意义上类似于记录 java 配置,例如

logback
。您可以通过 XML 文件或以编程方式提供它。 没有其他方法,从逻辑和理论的角度来看,您需要以某种方式向框架提供此信息。

因此,以编程方式配置

jakarta-validation-api
取决于供应商。也就是说,每个实现可能有(或可能没有!)一些 API,允许您说“我希望此字段不为空,不为空并且长度至少为 3 个字符”。我知道 Hibernate 确实有一个编程验证 API 。说实话,我不知道 Jeresy 验证引擎中有任何类似的东西。

所以我建议您要么使用 Hibernate 编程配置,要么找到其他以编程方式配置约束的实现。

© www.soinside.com 2019 - 2024. All rights reserved.