MultiException, wenn benutzerdefinierte jersey param wirft exception
HINWEIS: Alle code, um dieses problem zu reproduzieren ist erhältlich bei https://gist.github.com/SrikanthRao/c9fc35e6fe22a74ab40c
http://localhost:8080/date/bean?date=2014-13-23 (mit BeanParam) produziert
"{"- code":500,"message":"Es war ein Fehler bei der Bearbeitung Ihrer Anfrage. Es wurde protokolliert (ID 48be9aa43bd49547)."}" ohne Zugabe MultiExceptionMapper nach jersey.
Wenn ich MultiExceptionMapper jersey, die über die url-Ergebnisse in
"Datum ist entweder nicht in YYYY-MM-DD format oder ist ungültig"
http://localhost:8080/date?date=2014-13-23 (direct @QueryParam-parameter) produziert
"Das Datum ist entweder nicht in YYYY-MM-DD format oder ist ungültig"
Paar Fragen:
- Ist dies die richtige Art und Weise zu handhaben input-Validierung in einer saubereren Weg?
- Ich erwartet, dass dies funktioniert, ohne eigene MultiExceptionMapper. Nicht Jersey-support custom *Params innen ein POJO eingespritzt wird, wie @BeanParam in Ressource-Methoden?
Hier wird der stack-trace erzeugt, wenn Anforderung (ohne Zugabe MultiExceptionMapper jersey). Natürlich entfernt, lange Spuren. Lassen Sie mich wissen, wenn Sie brauchen, vollständige stack-trace.
ERROR [2015-05-04 18:48:33,366] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 0f23e4de758653d6
! javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
! at io.dropwizard.jersey.params.AbstractParam.<init>(AbstractParam.java:28) ~[dropwizard-jersey-0.8.1.jar:0.8.1]
! at com.fun.myapp.LocalDateTimeParam.<init>(LocalDateTimeParam.java:20) ~[classes/:na]
! at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_45]
...
...
Causing: org.glassfish.hk2.api.MultiException: A MultiException has 3 exceptions. They are:
! 1. javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
! 2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.fun.myapp.PaginationFilters errors were found
! 3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.fun.myapp.PaginationFilters
!
! at org.jvnet.hk2.internal.Collector.throwIfErrors(Collector.java:88) ~[hk2-locator-2.4.0-b10.jar:na]
! at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:252) ~[hk2-locator-2.4.0-b10.jar:na]
! at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:360) ~[hk2-locator-2.4.0-b10.jar:na]
! at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) ~[hk2-locator-2.4.0-b10.jar:na]
....
....
WARN [2015-05-04 18:48:33,401] org.glassfish.jersey.internal.Errors: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 3
javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
at io.dropwizard.jersey.params.AbstractParam.<init>(AbstractParam.java:28)
at com.fun.myapp.LocalDateTimeParam.<init>(LocalDateTimeParam.java:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
...
...
MultiException stack 2 of 3
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.fun.myapp.PaginationFilters errors were found
at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:249)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:360)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
...
...
MultiException stack 3 of 3
java.lang.IllegalStateException: Unable to perform operation: resolve on com.fun.myapp.PaginationFilters
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:389)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471)
at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:162)
Ich habe diese Frage gestellt, auf die dropwizard-Nutzer die google-Gruppe - https://groups.google.com/forum/#!Thema/dropwizard-user - /yW-RXSSlspY
- Haben Sie implementiert den code entsprechend an : // gibt gültige Antwort Objekt hier.
- ein weiterer Punkt. Die Ausnahme beschwert sich über die Klasse com.Spaß.persönlichen.Finanzen.params.PaginationFilters. Können Sie überprüfen, ob es einen öffentlichen Konstruktor?
- Ja, das habe ich umsetzen Rücksendung richtige Antwort. lassen Sie mich update-post, damit es einfacher zu verstehen. Eine weitere Sache ist, dass ich geändert-Klassen hier nicht kopieren, alles, was ich habe. die stacktrace-bezieht unterschiedliche Namen. Die Festsetzung es. Es ist ein Konstruktor ohne Argumente.
- der code: return Response.serverError(); nicht kompilieren bei mir. Ich hatte zum Anhängen einer .build(). Außerdem, @NoArgsConstructor ist nicht einer dropwizard-annotation. Wo hast du es bekommen? Btw, bei der Verwendung von LocalDateTimeParam als parameter der error-Methode funktionierte gut für mich. Das Problem scheint im Zusammenhang mit der Verpackung in PaginationFilters. Können Sie den code mit es so thant ich kann Ihr problem reproduzieren?
- Ich verstehe es nicht. Heißt das, dass problem behoben ist? Und du postest das problem Ausnahme vor, um zu reparieren, und alles, was Sie wissen wollen ist, ob die ExceptionMapper ist die richtige Lösung?
- Sorry für die Unklarheit. AFAIU,Ihre Anforderung ist, um die Reaktion von LocalDateTimeParam-error " - Methode, wenn die Eingabe falsch ist. Als ein Anfang, ich habe Ihre LocalDateTimeParam als einen parameter einer Methode. wenn ich den pass ungültiges Datums-format, bekomme ich die Antwort von LocalDateTimeParam. Also es ist kein bug in dropwizard im Zusammenhang mit dem aufrufen der Fehler-Methode. Als Nächstes würde ich gerne testen, wenn LocalDateTimeParam ist ein Feld von PaginationFilters und der parameter PaginationFilters. In der gleichen Bedingungen, dann sind Sie, ich brauche, um zu sehen, wie Sie injiziert in die Ressource-Methode mit der @BeanParam.Können Sie beweisen, dass code
- Aktualisierte post Ihre Fragen zu klären. Code Hinzugefügt, um zu reproduzieren.
- Aktualisierte Frage zu klären Ihre Fragen. Ich fixierte es mit eigener exception-mapper.
- Hast du jemals eine Lösung finden? Ich bin mit dem gleichen Problem. Ich habe eine BeanParam, wo eines der Mitglieder hat eine ParamConverter
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage 1
Laut dropwizard-Kern-Dokumentation, sehe ich zwei mögliche Implementierungen zur Validierung von Eingaben:
Dieser scheint nicht geeignet zu sein, für Ihren Fall. In der Tat, es gibt keine Anmerkungen für LocalDateTime und die Schaffung eines führt zum Parsen der LocalDateTime zweimal: für die Validierung und für die Einstellung von bean-Feld.
Zur Beantwortung Ihrer ersten Frage, ich würde sagen, dass die Verwendung eines exception-mapper ist völlig in Ordnung in deinem Fall.
Frage 2
Das Debuggen isValidDate Verfahren zeigt, dass die @BeanParam version verwendet ClazzCreator.java während die @QueryParam nicht. Diese Klasse ist verantwortlich für die Erstellung der bean-Instanz der Klasse. Wenn Sie das Kontrollkästchen Linie 226 die Klasse, Sie werden sehen, dass es sammelt mehrere Ausnahmen beim analysieren von Eingaben mit mehreren Fehlern. Damit sollte die Berichterstattung einige Fehler in Bezug auf die verschiedenen bean-Felder, darunter auch einige spätere Ausnahmen.
Die Antwort ist, dass Jeysey unterstützt *Params innen ein POJO. Jedoch, die zugehörigen Ausnahme-in gekapselt in einem MultiException im Rahmen von @BeanParam.
Deshalb, wenn Sie planen, andere Felder hinzufügen PaginationFilters, sollten Sie überlegen, die Berichterstattung mehrere Fehler in den zugeordneten exception-Meldung.
1/in zur Validierung Datum, ich bevorzuge es, zu analysieren, "Termine" mich. Es ist einfach und sauber. Hier finden Sie einige arbeiten code :
in diesem code ein, den Sie anrufen
zurück :
werfen Sie einen Blick auf gist : https://gist.github.com/jeorfevre/6e46ae8d9232f7f9d7cc
2/um zu fangen, Ausnahmen, eine gute Praxis ist, zu fangen, server-Ebene Ausnahme mit den Anbietern (durch die Registrierung eines Anbieters, um Ihre app).
Und für die App-Ebene Ausnahme, nutzen Sie Ihre Ausnahme, indem Sie sich mit Antwort.status( status der Ausnahme) .....
Bitte werfen Sie einen Blick auf meine Gabel gist, ich habe ein _ServerError.class und ich habe mich registriert in der app :
bitte werfen Sie einen Blick auf die offizielle doc, die ist klip und klar :
offizielle jersey Darstellung doc