1

假设我有一个使用 Spring MVC 构建前端的应用程序。同一个应用程序公开 API 用于集成目的。

Web 中的错误通过使用 Spring MVC form:error 标记通过使用 JSR-303 和带有自定义约束的 Hibernate 验证器来显示。

一切都很好,但是我想在我的 API 层中重用相同的验证,如果验证失败,则失败并显示错误代码。

假设我有一个 POJO 对象(只是一个例子):

@ValidDomainObject
public class DomainObject {

    public String superSetting;

    public String anotherSetting;

    public String getSuperSetting() {
        return superSetting;
    }

    public void setSuperSetting(String superSetting) {
        this.superSetting = superSetting;
    }

    public String getAnotherSetting() {
        return anotherSetting;
    }

    public void setAnotherSetting(String anotherSetting) {
        this.anotherSetting = anotherSetting;
    }

}

并且 @ValidDomainObject 由此验证器验证:

public class DomainObjectValidator implements ConstraintValidator<ValidDomainObject, DomainObject> {

    @Override
    public void initialize(final ValidDomainObject constraintAnnotation) {

    }

    @Override
    public boolean isValid(final DomainObject obj, final ConstraintValidatorContext context) {
        context.disableDefaultConstraintViolation();
        if (obj.getAnotherSetting().equals(obj.getSuperSetting())) {
            context
                    .buildConstraintViolationWithTemplate("{message.to.show}")
                    .addConstraintViolation();
        }
    }
}

在前面的 MVC 层中一切都很好 - 我在语言文件中定义 message.to.show 以解析为“无法将 X 设置为 Y”之类的内容,并且用户会在页面上看到该消息。

那么我如何在 API 层实现同样的功能呢?如果我想用 ErrorCodes.PROPERTIES_MATCH 或类似的方法抛出 ServiceFault?

我可以简单地使用:

   Set<ConstraintViolation<DomainObject>> validationErrors = validator.validate(domainObject);

然后循环检索到的集合检查消息并使用给定的错误代码构建故障。但这似乎是与 API 层的前端耦合。

我可以反之亦然:

      context.buildConstraintViolationWithTemplate(
ErrorCodes.PROPERTIES_MATCH.toString()) .addConstraintViolation();

但是,前端的消息结构与其他消息不同,也没有插值。

最好的方法是什么?

4

0 回答 0