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 は、この 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();

ただし、フロントエンドのメッセージ構造は他のメッセージとは異なり、補間はありません。

最善のアプローチは何ですか?

4

0 に答える 0