Benutzerdefinierte Ausnahmezuordnung für die Bean-Validierung auf TomEE 7?

8

Kontext

Wir verwenden eine javax.ws.rs.ext.ExceptionMapper<Exception> , die mit @javax.ws.rs.ext.Provider annotiert ist, um alle Ausnahmen zu behandeln. Intern unterscheidet diese ExceptionMapper zwischen verschiedenen Arten von Ausnahmen, um zu bestimmen, welche Informationen dem Client offengelegt werden sollen.

Im Fall von javax.validation.ConstraintViolationException geben wir zusätzliche Informationen darüber zurück, welches Feld ungültig war und warum.

Problem

Wir haben gerade von TomEE 1.7.2 JAX-RS auf TomEE 7.0.0-SNAPSHOT webprofile gewechselt.

Mit TomEE 1.7.2 JAX-RS haben wir die Systemeigenschaft openejb.jaxrs.providers.auto=true verwendet, unsere ExceptionMapper wurde automatisch gefunden und verwendet.

Mit TomEE 7.0.0-SNAPSHOT webprofile ist die Eigenschaft nicht mehr erforderlich, um von der automatischen Erkennung zu profitieren.

Allerdings wird auch org.apache.cxf.jaxrs.validation.ValidationExceptionMapper erkannt und fungiert nun als das bevorzugte ExceptionMapper für javax.validation.ConstraintViolationException . Unser eigenes ExceptionMapper wird nicht ausgeführt und der Client erhält daher keine Informationen darüber, was während der Validierung schief gelaufen ist.

Unser eigenes ExceptionMapper<Exception> behandelt weiterhin alle anderen Ausnahmen.

Was ich schon probiert habe

"duplizieren" den spezialisierten ExceptionMapper

Ich habe mein eigenes javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException> neben meinen Ressourcen platziert, in der Hoffnung, dass es Vorrang vor dem CXF hat.

Immer noch hat org.apache.cxf.jaxrs.validation.ValidationExceptionMapper Vorrang.

Update: Es stellte sich heraus, dass dies tatsächlich den Zweck erfüllt. Ich weiß nicht, warum mein erster Test nicht funktioniert hat.

Deaktivieren Sie die ValidationExceptionMapper via system.properties

In changelog von TomEE 7.0.0-SNAPSHOT Ich bemerkte

  

TOMEE-1336 Support classname.activated = true / false für Automatisch erkannte Anbieter

Mit Blick auf die entsprechende changeset war ich hoffnungsvoll, dass ich könnte die org.apache.cxf.jaxrs.validation.ValidationExceptionMapper einfach durch Hinzufügen deaktivieren     org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated = false zu unserem system.properties .

Dies blieb ohne Wirkung.

Fragen

  • Ist das CXF- oder TomEE-Verhalten?
  • Wie konfigurieren wir, welches ExceptionMapper Vorrang hat?
Schroenser 17.11.2015, 14:55
quelle

1 Antwort

6

Macht jetzt etwas Zeit, denkt aber, dass es von der Spezifikation benötigt wird, aber Sie können es deaktivieren, indem Sie cxf.jaxrs.skip-provider-scanning=true setzen.

Es deaktiviert vollständig Auto-Anbieter einschließlich der gescannten, aber dann können Sie die gewünschte in openejb-jar.xml - sicherlich die beste und sicherere Lösung IMHO sonst Sie hängen eine Menge der libs und Container-Setup Sie verwenden.

Es gibt keine Priorität afaik, weil die Ausnahmehierarchie verwendet wird.

edit: verpasste einen Teil: Sie müssen impl ExceptionMapper{ValidationException} anderenfalls CXF one hat eine höhere Priorität als Ihr eigener (Ausnahme ist weniger spezifisch) edit 2: Ссылка für den aktivierten Support

    
Romain Manni-Bucau 17.11.2015, 15:16
quelle