Wenn Sie mit dem Bean Validation Framework vertraut sind, wissen Sie, dass Sie den Namen eines Methodenarguments nicht ermitteln können. Wenn Sie also eine @NotNull-Einschränkung für das erste Argument einer Methode ausführen und die Validierung fehlschlägt, wird getPropertyPath so aussehen wie "arg1".Kann ich den Eigenschaftspfad in einem ConstraintValidator für Method-Argumente ändern?
Ich möchte meine eigene Version von @NotNull erstellen, die einen Wert z. @NamedNotNull ("E-Mail-Adresse"). Aber ich kann nicht herausfinden, wie man den #getPropertyPath in meinem Validator überschreibt? Gibt es eine Möglichkeit, dies zu tun, oder bin ich mit „arg1“ stecken oder „arg2“ usw.
EDIT
Basierend auf der Antwort, die ich erhielt ich konnte mit der folgenden Umsetzung zu entwickeln, die Erlaubt mir, den Wert aus meinen @QueryParam- oder @PathParam-Annotationen zu übernehmen und diese als Eigenschaftspfad für Bean-Validierungsanmerkungen wie @NotNull zu verwenden.
Für Jersey müssen Sie die folgende Klasse erstellen. Beachten Sie die Implementierung von DefaultParameterNameProvider:
register(ValidationConfigurationContextResolver.class);
Das ist es:
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {
@Override
public ValidationConfig getContext(final Class<?> type) {
final ValidationConfig config = new ValidationConfig();
config.parameterNameProvider(new RestAnnotationParameterNameProvider());
return config;
}
static class RestAnnotationParameterNameProvider extends DefaultParameterNameProvider {
@Override
public List<String> getParameterNames(Method method) {
Annotation[][] annotationsByParam = method.getParameterAnnotations();
List<String> names = new ArrayList<>(annotationsByParam.length);
for (Annotation[] annotations : annotationsByParam) {
String name = getParamName(annotations);
if (name == null)
name = "arg" + (names.size() + 1);
names.add(name);
}
return names;
}
private static String getParamName(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation.annotationType() == QueryParam.class) {
return QueryParam.class.cast(annotation).value();
}
else if (annotation.annotationType() == PathParam.class) {
return PathParam.class.cast(annotation).value();
}
}
return null;
}
}
}
Dann in Ihrem RestConfig Sie die folgende Zeile hinzufügen müssen. Jetzt enthalten Ihre ConstraintValidationExceptions den Namen des QueryParam oder PathParam, mit dem sie kommentiert werden. Zum Beispiel:
public void getUser(
@NotNull @QueryParam("emailAddress") String emailAddress,
@NotNull @QueryParam("password") String password)
{ ... }
was passiert, wenn man verwenden Jersey nicht? – Dejell
Sehr nützlich, danke. Ich habe ein wenig Verfeinerung: 'if (name == null) name = "Nutzlast [" + parameterTypes [index] .getSimpleName() + "]";' statt ' "arg"'. Dies stellt die Art der Nutzlast, der Parameter ohne die inspizierten Annotationen im Verfahren Rest. Dies ergibt '" Pfad ":" SomeResource.testValidation.payload [PayloadDto] .attributes "' bei der Validierung der Felder des Payload-DTO (und des Typs der Payload, wenn sie vollständig fehlt und die Annotation @NotNull hat). –
PhiLho