定义客户端能够使用的API。客户将通过各种方式连接。其中之一是java-to-java。在这个特定的情况下,我有一个问题。显然,API应尽可能与实现分离。我还没有机会测试这个,但是用户定义的验证不会打破这个模型吗?
我在API服务器端实现上通过Spring @Validated启用验证。不想把它放到@Controller类中,因为这不是进入服务(API)的唯一方法。
例如,如果我在界面中定义了此方法:
SomeObject updateOperation( AnInputClass param) ...
然后我可以使用JSR-303验证进行注释,但仍然可以解耦: @NonNull SomeObject updateOperation(@NonNull AnInputClass param)... 但是如果我想在输入“param”的各个部分/部分上进行自定义验证,我需要创建自己的Annotation,具有@Constraint(validatedBy)部分这部分将与验证相关联实现。缩写形式如下:
SomeObject updateOperation ( @CheckInput AnInputClass param)...
...where the annotation is defined as
...
@Constraint(validatedBy = CheckInputValidator.class) // this is the coupling issue
public @interface CheckInput { ....
由于这一切都发生在服务器端,因此不需要Java客户端必须具有此CheckInputValidator类;但是,我看不到任何选择。首先,我喜欢在API中进行验证 - 它们告诉用户将验证什么。如果我可以打破依赖关系并将验证转移到看似可接受的权衡的实现。然而,这导致下面的例外,所以我似乎被卡住了。有人可以帮忙吗?
javax.validation.ConstraintDeclarationException: Only the root method of an
overridden method in an inheritance hierarchy may be annotated with parameter
constraints, but there are parameter constraints defined at all of the
following overridden methods
答案 0 :(得分:3)
我自己找到答案,我应该早点意识到这一点!
我需要做的就是在界面/ API层中使用“@Valid”注释。然后,确保用户定义/自定义注释上的@Target注释定义了“TYPE”,将@CheckInput注释应用于所需的类,一切都很完美!