Mam następujący zasób zużywający JSON odwzorowany na POJO.Niestandardowa aplikacja ExceptionMapper for Jersey nie działa z niepoprawnym wpisem JSON
@Path("example")
public class ExampleResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addThesis(MyObject myObject) {
return Response.ok().entity("Test").build();
}
}
Oto klasa POJO:
public class MyObject {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Kiedy wysłać żądanie POST z ciałem { "title": "tytuł Test"} wszystko działa poprawnie. Odpowiedź: Test, zgodnie z oczekiwaniami. Jednak, kiedy zmienić wniosek do { "titlee": "Test" tytuł} serwer odpowiada z tym:
Nierozpoznany pole "titlee" (klasa com.my.package.MyObject), nie oznakowane jako niezapomniany (jedna znana właściwość: "tytuł")) w [Źródło: org.glassfish.jersey.me[email protected]6dc6a46a; linia: 2, kolumna: 11] (przez łańcuch referencyjny: com.my.package.MyObject ["titlee"])
Oczywiście jest to wyjątek wyrzucony i zwrócony przez Jersey. Jak mogę przechwycić ten wyjątek i zwrócić niestandardowy kod statusu i wiadomość?
Co próbowałem tak daleko jest do realizacji własne ExceptionMapper:
@Provider
public class MyJsonExceptionMapper implements ExceptionMapper<JsonProcessingException> {
public Response toResponse(JsonProcessingException e) {
return Response.status(400).entity("JSON Processing Error").build();
}
}
Niestety odpowiedź pozostaje taka sama. Kiedy implementuję ExceptionMapper dla niestandardowego wyjątku i wyrzucam odpowiedni wyjątek w metodzie zasobów, wszystko działa poprawnie. Zakładam, że ma to związek z domyślnym wyjątkiem ExceptionMapper dla JsonProcessingException przesłaniającym mój własny. Potem próbowałem stworzyć ogólny program odwzorowujący ("implementuje ExceptionMapper"), ale znowu nie ma sukcesu.
Szukałem dosłownie wszędzie i próbowałem wielu rzeczy, w tym przedłużania ResourceConfig i rejestrowania mojego programu odwzorowującego, ale nic nie zadziałało tak daleko.
Kilka dodatkowych informacji, które mogą pomóc w zmniejszeniu problemu: Używam Grizzly2 jako serwera HTTP, który wdrażam jako Fat JAR.
Część zależność mojego pom.xml wygląda następująco:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.24</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>2.24</version>
</dependency>
</dependencies>
Każda rada jest bardzo ceniona.
Z tego co pamiętam, myślę, że implementując program odwzorowujący JsonMappingException i JsonParseException, powinien on zastąpić domyślne. Nie jestem do końca pewien, jak je wyłączyć. –
Implementacja programu odwzorowującego dla 'Throwable' powinna zastąpić/wszystkie/istniejące elementy odwzorowujące. Ale to nie działa. W dodatku ResourceConfig nie można również poprawić właściwości 'ExceptionMapper' explicity. –
BadZen
(Również implementacja 'ExtendedExceptionMapper', jak sugerują dokumenty również nie działa ...) – BadZen