假设我有一个使用 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();
但是,前端的消息结构与其他消息不同,也没有插值。
最好的方法是什么?