2015-03-02 16 views
6

So möchte ich die Validierungsnachrichten ändern, die zum Validieren eines Modells über eine DropWizard-Ressource verwendet werden.Override DropWizard ConstraintViolation Nachricht

Ich verwende Java-Validierung Anmerkungen. Zum Beispiel ist hier eines der Felder, die ich überprüfen möchten:

@NotEmpty(message = "Password must not be empty.") 

kann ich testen, dies funktioniert wie erwartet eine Prüfung verwendet werden.

Wenn ich DropWizard jedoch verwende, um die Überprüfung der Ressource durchzuführen, fügt sie dieser Nachricht zusätzliche Daten hinzu. Was ich sehe, ist dies - password Password must not be empty. (was null) und ich habe den Code gefunden, das tut dies hier - https://github.com/dropwizard/dropwizard/blob/master/dropwizard-validation/src/main/java/io/dropwizard/validation/ConstraintViolations.java

Insbesondere diese Methode -

public static <T> String format(ConstraintViolation<T> v) { 
    if (v.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod) { 
     final ImmutableList<Path.Node> nodes = ImmutableList.copyOf(v.getPropertyPath()); 
     final ImmutableList<Path.Node> usefulNodes = nodes.subList(0, nodes.size() - 1); 
     final String msg = v.getMessage().startsWith(".") ? "%s%s" : "%s %s"; 
     return String.format(msg, 
          Joiner.on('.').join(usefulNodes), 
          v.getMessage()).trim(); 
    } else { 
     return String.format("%s %s (was %s)", 
          v.getPropertyPath(), 
          v.getMessage(), 
          v.getInvalidValue()); 
    } 
} 

Gibt es eine Möglichkeit, dieses Verhalten zu überschreiben? Ich möchte nur die Nachricht anzeigen, die ich in der Anmerkung eingestellt habe ...

Antwort

5

ConstraintViolationExceptionMapper ist derjenige, der diese Methode verwendet. Um es zu überschreiben, müssen Sie es abmelden und Ihre eigene ExceptionMapper registrieren.

Entfernen Sie die Ausnahme-Mapper (s)

Dropwizard 0.8

Fügen Sie Folgendes zu Ihrer YAML-Datei. Beachten Sie, dass dadurch alle Standard-Ausnahme-Mapper entfernt werden, die der Drop-Assistent hinzufügt.

server: 
    registerDefaultExceptionMappers: false 

Dropwizard 0.7.x

environment.jersey().getResourceConfig().getSingletons().removeIf(singleton -> singleton instanceof ConstraintViolationExceptionMapper); 

Ihren eigenen Exception-Mapper

public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> { 

    @Override 
    public Response toResponse(ConstraintViolationException exception) { 
     // get the violation errors and return the response you want. 
    } 
} 

und fügen Sie Ihren Ausnahme-Mapper in Ihrer Anwendungsklasse erstellen und hinzufügen.

public void run(T configuration, Environment environment) throws Exception { 
    environment.jersey().register(ConstraintViolationExceptionMapper.class); 
} 
+0

Ich mag [Lukasz Wiktor Antwort] (http://stackoverflow.com/a/30799426/1891566) besser, weil er wieder instates die andere Ausnahme Mapper, dass der erste Schritt dieser Antwort entfernt, effektiv ändert * nur der Mapper für 'ConstraintValidationException's * –

6

Hier ist eine programmatische Lösung in dropwizard 0,8:

public void run(final MyConfiguration config, final Environment env) { 
    AbstractServerFactory sf = (AbstractServerFactory) config.getServerFactory(); 
    // disable all default exception mappers 
    sf.setRegisterDefaultExceptionMappers(false); 
    // register your own ConstraintViolationException mapper 
    env.jersey().register(MyConstraintViolationExceptionMapper.class) 
    // restore other default exception mappers 
    env.jersey().register(new LoggingExceptionMapper<Throwable>() {}); 
    env.jersey().register(new JsonProcessingExceptionMapper()); 
    env.jersey().register(new EarlyEofExceptionMapper()); 
} 

Ich denke, es ist als eine Konfigurationsdatei zuverlässiger ist. Und wie Sie sehen können, ermöglicht es auch alle anderen default exception mappers.

+1

Dies sollte die akzeptierte Antwort sein, da der aktuelle mehr Ausnahme Mapper entfernt, als was das OP angefordert hat. –