Globale Ausnahmebehandlung in Jersey & Frühling?
Ich bin der Entwicklung der RESTful webservices mit Jersey & Spring 3.2 zusammen mit Offenen CMIS.
Ich bin nicht mit MVC-Muster von Frühling und es ist nur Spring IOC & Jersey SpringServlet, die controller-Klasse ist so etwas wie code unten
@GET
@Path("/{objId:.+}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public statusMsg addObject(@PathParam("objId") String objId{
return repoService.addObject(objId);
}
In der repoService ich bin der Durchführung der business-Logik, um das Objekt hinzufügen, das mit CMIS, meine Frage ist, ich Fang um 5 Ausnahmen im Zusammenhang mit CMIS dann die Basis-Ausnahme ich.e Ausnahme, sondern für jede service-Methode, die ich habe zu wiederholen, was ich nicht tun will.
War ich auf der Suche auf Google und fand, dass @ControllerAdvice ist die beste Lösung für diese problem wheer Sie können festlegen, alle geprüft & unchecked exceptions und wo auch immer entfernen Sie alle try-catch-Blöcke aus der Anwendung. Es ist aber nur Arbeit mit MVC-Muster.
Frage 1: gibt es eine Möglichkeit, kann ich dieses in oben Jersey-Spring-framework?
Nach mehr Forschung fand ich, dass Jersey bietet ExceptionMapper zu handhaben kundenspezifische Ausnahme, aber ich will fangen Sie mehr CMIS-Ausnahme oder Standard-Ausnahme oder eine IO-Exception etc.
Frage 2: Wie kann ich es mit ExceptionMapper?
Frage 3: Bin ich auf dem richtigen Ansatz oder empfehlen Sie besser Ansatz zur Behandlung solcher Probleme.
Vielen Dank im Voraus.
InformationsquelleAutor user3306543 | 2014-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutze ich jersey2.11 mit Tomcat und fast-Ausnahme-Griff mit ExceptionMapper.
(In domain Logik, nur DB-rollback-Vorgang verwenden von try-catch-code.)
Ich denke ExceptionMapper mit @Provider wählen automatisch die richtige ExceptionMapper. Also ich nehme an, diese Funktion ist zufrieden mit dem "ich will fangen Sie mehr CMIS-Ausnahme oder Standard-Ausnahme oder eine IO-Exception etc."
Dieser code ist mein Umgang mit ExceptionMapper design code.
1.Einige Jersey-Root-Ressource-Klasse
2.ExceptionMapper Paket. com.yourdomain.exceptionmapper
AbstractExceptionMapper.java (Alle ExceptionMapper Klasse erweitert diese Abstrakte Klasse)
ExceptionMapper.java (zumindest dieser mapper kann fängt jede Ausnahme, die nicht zu definieren, geben Sie exception-mapper.)
WebApplicationExceptionMapper.java (Angeben WebApplicationException)
ConstraintViolationExceptionMapper.java (Angeben Hibernate Validator ConstraintViolationException)
.. und andere angeben, Ausnahme erstellen können ExceptionMapper Klassen.
Meiner Erfahrung, Ausnahme Mapper ist high-level-Idee für den Fokus auf domain-Logik. Könnte es vertreiben langweilig verstreut try-catch-block code von der domain-Logik.
Ich hoffe also, dass Sie das Gefühl "ja, ich bin" bei Frage 3 um das problem zu beheben auf Ihre Umwelt.
Glück.
ich kann nicht "add comment" für die Antwort, also ich füge unten einen Kommentar.
Sie nicht verwendet haben, versuchen Sie zu fangen und werfen überall in der gesamten Anwendung.
Mein code design verwenden, löst die Methode, wie dies und das machen zu verwalten, indem ExceptionMapper Klassen.
Also im obigen Ansatz habe ich erstellt, nur 1 Klasse für alle Ausnahmen, die ich erwarten konnte, und für jede unbekannte Ausnahme der Basis, Ausnahme wird es zu fangen.
Jetzt, wo in meiner Anwendung, wenn irgendeine Ausnahme Auftritt, kommt es zu den CentralControllerException und entsprechende Antwort mit http-status-code zurück geschickt.
F. 2. Sehen Sie das Problem im obigen Ansatz.
Ich denke, wenn einfaches Projekt oder nie aktualisieren/ändern-Projekt (Projekt-lifecycle kurze Zeit), Ihr in eine Klasse und exception-mapper-Ansatz ok.
Aber ... ich habe nie mit diesem Ansatz. Ganz einfach, wenn Sie brauchen, um zu verwalten mehr Ausnahme, diese Methode werden große und Komplex, und schwer zu Lesen und zu pflegen sein werden.
In meine Politik, OOP verwenden sollte pleomorphism Strategie für jeden level-code(Klasse plan, DI plan), und dieser Ansatz einige Teil-Ziel-Laufwerk heraus, wenn Sie/switch-block im code. Und diese Idee machen jede Methode kurz-code und einfachen, klaren "domänenlogik" und code werden, um beständig zu ändern.
Also ich erstelle implementiert ExceptionMapper und Delegierter DI die ExceptionMapper Klasse verwalten Ausnahme.
(So, DI verwalten ersetzen Sie Ihre Klasse If-block verwalten, die Ausnahmebehandlung, das ist in der Regel refactoring-Ansatz ähnlich dem Extrakt xxx http://refactoring.com/catalog/extractClass.html.
In unserer Diskussion Fall, eine einzige Klasse und eine Methode zu beschäftigt, so extrahieren Sie alle ExceptionMapper Klasse nähert und DI nennen geeignete Klasse & Methode Strategie.)
Btw, system-Verarbeitung Ergebnis derselben ist derzeit Punkt. Aber wenn Bedarf zu einer Reduzierung der künftigen Entwicklung Kosten ,sollte nicht nahm Ansatz einer Klasse exception handling plan. Denn wenn Sie aufgeben, einfach code und Refactoring-status, Projekt-code ist schneller tot.
Dies ist meine Idee und warum ist dieses.
Grüße.
InformationsquelleAutor kj13
vielen Dank für Ihre Antwort. Ich kann sehen, die Sie erstellt haben, die mehrere Klassen basierend auf den Typ der Ausnahme und Verhalten.
Q1. In Ihren Diensten-Methode sind Sie das werfen einer Ausnahme wie
oder Sie nicht verwendet haben, versuchen Sie zu fangen und werfen überall in der gesamten Anwendung.
Tatsächlich, ich habe versucht, etwas, wo in meinem web-Anwendung, die ich bin nicht mit try -, catch-und wirft überall und in meinem CentralControllerException habe ich erwähnt, wie folgt:
Also im obigen Ansatz habe ich erstellt, nur 1 Klasse für alle Ausnahmen, die ich erwarten konnte, und für jede unbekannte Ausnahme der Basis, Ausnahme wird es zu fangen.
Nun überall in meiner Anwendung, wenn irgendeine Ausnahme Auftritt, kommt es zu den CentralControllerException und entsprechende Antwort mit http-status-code zurück geschickt.
Q. 2. Sehen Sie das Problem im obigen Ansatz.
InformationsquelleAutor user3306543