In einem meiner Projekte habe ich Jersey von der Version 2.14
auf 2.23
aktualisiert. Aber ich habe viele Stunden mit einem Problem zu kämpfen. Mein Projekt definiert sein eigenes ExceptionMapper
für ein ValidationException
, aber leider hat Jersey bereits einen eingebauten Exception Mapper für diese Ausnahme und ich kann es nicht überschreiben.
Ich habe meinen eigenen Mapper korrekt registriert (ich habe ihn überprüft), der im Folgenden dargestellt wird:
%Vor% aber es wird nie aufgerufen. Jersey holt immer den org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper
ab.
Ich habe auch versucht, @Priority
Annotation für meinen benutzerdefinierten Mapper zu verwenden, aber leider berücksichtigt Jersey es nicht.
Also, was ist los? Es funktionierte perfekt in der vorherigen Jersey-Version, es scheint also ein Regression Bug.
Ich gebe auf. Irgendwelche Hinweise?
Es stellte sich wirklich heraus, dass es sich um einen Regressionsfehler in Jersey handelte, der im Januar 2015 eingeführt wurde.
Der Fehler steht in Zusammenhang mit den Erweiterungen von zwei Jersey: für die Validierung von Schweißnähten und Bohnen.
Da der Weld-Container nicht gestartet wurde, hat mein benutzerdefinierter ValidationExceptionMapper
-Mapper Vorrang vor dem integrierten Modul jersey-bean-validation
, sodass mein Ziel erreicht wird.
Ich habe einen Fehlerbericht unter JERSEY-3153 ausgefüllt.
Um ehrlich zu sein, werde ich niemals wieder Weld + Jersey benutzen ... Ich bin so müde mit dieser Kombination. In den letzten zwei Jahren habe ich bereits 10 Bugs entdeckt. Ich bin wirklich müde.
Jedenfalls hoffe ich, dass es jemandem hilft.
UPDATE : Wie @Justin Jose in den Kommentaren unten bemerkt, gibt es auch noch einen Workaround für den erwähnten Bug. Wir können HK2-Bindungen verwenden, um den problematischen integrierten Mapper zu überschreiben:
%Vor%Der in Jersey integrierte ValidationExceptionMapper wird über ValidationFeature registriert. Vermutlich kann das Ersetzen von Trikes ValidationFeature mit Ihrer eigenen Version den Trick bewirken. Es kann wie folgt gemacht werden.
Zuerst deaktivieren Sie automatisch erkennbare ValidationFeature
%Vor%Der nächste Schritt besteht darin, einen Klon von Jerseys Validierungsfunktion zu registrieren
%Vor%Im Klon sollten Sie Ihren neuen ExceptionMapper angeben.
Registrieren Sie abschließend Ihr neues Feature
%Vor%UPDATE:
Ab Jersey 2.20 kann der Standard ValidationExceptionMapper
mit Hilfe der HK2-Bindung wie unten gezeigt überschrieben werden.
});
Ich habe einen Weg gefunden, um es mit neueren Jersey-Veröffentlichungen wieder in Gang zu bringen, die ich auch unter deinem Fehlerbericht veröffentlicht habe.
Man muss Jersey lokal mit dem geänderten Code erstellen, insbesondere das jersey-bean-validation
Artefakt.
Lokalisieren Sie org.glassfish.jersey.server.validation.internal.ValidationBinder
und kommentieren Sie die folgenden zwei Zeilen in configure()
:
Es ist irgendwie ironisch, dass der Quellcode-Kommentar über diesen Zeilen sagt, dass sie Benutzern erlauben sollen, ihre eigenen Anbieter zu registrieren.
Tags und Links java jersey embedded-jetty jersey-2.0 weld2