2

定义了客户端可以使用的 API。客户将通过多种方式连接。其中之一是java-to-java。在这种特定情况下,我遇到了问题。显然,API 应该尽可能地与实现分离。我还没有机会对此进行测试,但是用户定义的验证不会破坏这个模型吗?

我在 API 服务器端实现上通过 Spring @Validated 启用验证。不想将其放入 @Controller 类中,因为这不是进入服务 (API) 的唯一方法。

例如,如果我在接口中定义了这个方法:

SomeObject updateOperation( AnInputClass param) ...

然后我可以使用 JSR-303 验证进行注释并且仍然可以解耦:@NonNull SomeObject updateOperation(@NonNull AnInputClass param) ...但是如果我想对输入“参数”的各个部分/部分进行自定义验证,我需要制作我自己的注释,它有一个 @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
4

1 回答 1

3

我自己找到了答案,我应该早点意识到这一点!

我需要做的就是在接口/API 层中使用“@Valid”注解。然后,确保用户定义/自定义注释上的@Target 注释定义了“类型”,将@CheckInput 注释应用于所需的类,一切正常!

于 2012-09-27T21:33:46.623 回答