In einem meiner Projekte habe ich Jersey von Version 2.14
auf 2.23
aktualisiert. Aber ich habe viele Stunden mit einem Problem zu kämpfen. Mein Projekt definiert seine eigenen ExceptionMapper
für eine ValidationException
, aber leider Jersey hat bereits eine eingebaute Ausnahme Mapper für diese Ausnahme und ich kann es nicht überschreiben.Wie überschreiben Sie eine integrierte Ausnahme-Mapper in Jersey 2.23?
Ich habe richtig registriert (ich habe es) meine eigenen Mapper, die im folgenden dargestellt:
@Provider
public class ValidationExceptionMapper implements
ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException exception) {
return Response.status(Status.BAD_REQUEST).build();
}
}
aber es wird nie aufgerufen wird. Jersey immer die org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper
abholen. Ich habe auch versucht, @Priority
Annotation für meine benutzerdefinierte Mapper zu verwenden, aber leider berücksichtigt Jersey es nicht.
Also, was ist los? Es funktionierte perfekt in der vorherigen Jersey-Version, also scheint es ein Regression Bug zu sein.
Ich gebe auf. Irgendwelche Hinweise?
Sie könnten 'ConstraintViolationException' (das ist der tatsächliche Typ der Validierungsausnahmen) als eine Arbeit umgehen. Es ist spezifischer als 'ValidationException' und hat Vorrang. Ich habe nie herausgefunden, wie man diesen einen Mapper deaktiviert, ohne _alle_ Meta-Inf-Provider zu deaktivieren (keine spaßige Lösung). Meine Arbeit war, einfach einen Mapper für 'ConstraintViolationException' zu verwenden. –
Danke, ich weiß das, aber das löst das Problem überhaupt nicht. Weil die Anwendung auf 'ValidationException' reagieren muss. –
'ConstraintViolationException' erweitert' ValidationException'. Der mit der Bean-Validierung in Jersey geworfene Ausnahmetyp ist immer eine 'ConstraintViolationException'. Es funktioniert für 'ValidationException', weil Super-Typ-Mapper Sub-Typ-Ausnahmen behandeln können, gibt es keinen Mapper für den Subtyp –