フロントエンドが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 は、この Validator によって検証されます。
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();
ただし、フロントエンドのメッセージ構造は他のメッセージとは異なり、補間はありません。
最善のアプローチは何ですか?