7

私は Bean Validation で JAX-RS リソースを使用しており、これら 2 つの機能が期待どおりに統合されています。

ただし、検証エラーの場合に生成されるデフォルトのエラー メッセージは、次のようにパラメータ名を arg0 として報告します。

[PARAMETER]
[login.arg0.password]
[password is required]
[]

対応するメソッド定義:

@POST //and other JAX-RS annotations
public Response login(
        @NotNull
        @Valid
        LoginBody loginBody) {

   [...]

protected static class LoginBody {

    @NotNull(message =  EMAIL_REQUIRED)
    public String email;

    @NotNull(message = PASSWORD_REQUIRED)
    public String password;
}

私は通常、このメッセージ パターンに問題はありませんが、実際に厄介なのは、元のパラメーター名が認識されないという事実です。

ログインする。arg0の代わりにloginBody .password 。

これを修正する簡単な方法はありますか。たとえば、そのパラメータに明示的な名前を付けるなどです。

WildFly Swarm 2017.6.0 を使用しています。私が発見したことから、これは私がresteasy + resteasy-validator + hibernate-validatorを持っていることを意味します

ありがとう。

4

4 に答える 4

1

非常に簡単な解決策があります。次のように、制約定義で独自のエラー メッセージを設定できます。

@NotNull(message = "password is required")

JAX-RS パラメーター アノテーションに基づくより一般的なソリューションが必要な場合は、独自の単純なものを実装して、次のようParameterNamProviderに登録できvalidation.xmlます。これには、jboss モジュール構造を変更する必要がないという利点があります。また、コンパイラフラグを変更する必要はありませんでした...

public class AnnotatedParameterNameProvider implements ParameterNameProvider {
  @Override
  public List<String> getParameterNames(Constructor<?> constructor) {
    return lookupParameterNames(constructor.getParameterAnnotations());
  }

  @Override
  public List<String> getParameterNames(Method method) {
    return lookupParameterNames(method.getParameterAnnotations());
  }

  private List<String> lookupParameterNames(Annotation[][] annotations) {
    final List<String> names = new ArrayList<>();
    if (annotations != null) {
      for (Annotation[] annotation : annotations) {
        String annotationValue = null;
        for (Annotation ann : annotation) {
          annotationValue = getAnnotationValue(ann);
          if (annotationValue != null) {
            break;
          }
        }

        // if no matching annotation, must be the request body
        if (annotationValue == null) {
          annotationValue = "requestBody";
        }
        names.add(annotationValue);
      }
    }

    return names;
  }

  private static String getAnnotationValue(Annotation annotation) {
    if (annotation instanceof HeaderParam) {
      return ((HeaderParam) annotation).value();
    } else if (annotation instanceof PathParam) {
      return ((PathParam) annotation).value();
    } else if (annotation instanceof QueryParam) {
      return ((QueryParam) annotation).value();
    }
    return null;
  }
}

validation.xml 内:

    <validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.1.xsd"
                   version="1.1">
  <parameter-name-provider>com.yourcompany.providers.AnnotatedParameterNameProvider</parameter-name-provider>
</validation-config>

独自のものMessageInterpolatorを実装し、それをvalidation.xml

于 2018-06-20T12:44:00.223 に答える
0

ConstraintViolationExceptions の例外マッパーを実装して、そこにある情報 (制約違反のリスト) がパラメーター名の取得に役立つかどうかを確認できますか?

于 2017-07-16T08:59:53.457 に答える