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.
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.
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.
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.
ExceptionMapper
Vorrang hat? 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
Tags und Links java cxf bean-validation tomee tomee-7