我有一个简单的 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 让我毛骨悚然)
对于未来的读者:
一般来说,您可以在编译时提供一些关于您希望实体如何被验证的元信息,然后使用一些
jakarta-validation-api
验证引擎(Jeresy、Hiberate 等等),并且该引擎可以根据您提供的注释。创建同一实体的 2 个副本不仅乏味 - 而且容易出错,因此除非您有充分的理由,否则不要这样做(在本例中并非如此,请进一步阅读)。
如果没有注释,您需要自己编写验证,或者采用编程配置方法。它在某种意义上类似于记录 java 配置,例如
logback
。您可以通过 XML 文件或以编程方式提供它。 没有其他方法,从逻辑和理论的角度来看,您需要以某种方式向框架提供此信息。
因此,以编程方式配置
jakarta-validation-api
取决于供应商。也就是说,每个实现可能有(或可能没有!)一些 API,允许您说“我希望此字段不为空,不为空并且长度至少为 3 个字符”。我知道 Hibernate 确实有一个编程验证 API 。说实话,我不知道 Jeresy 验证引擎中有任何类似的东西。
所以我建议您要么使用 Hibernate 编程配置,要么找到其他以编程方式配置约束的实现。