Ich benutze Jersey 2.10 mit Jackson Serialisierung/Deserialisierung Feature in meiner REST API.Jersey Exception Mapper funktioniert nicht, wenn Jackson Deserialisierung fehlschlägt
Meine Idee ist es, meine REST-API immer eine Standard-JSON-Fehlerantwort zurückgeben. Dafür habe ich ExceptionMapper-Klassen, die richtige json-Fehlerantworten für jede Ausnahme erstellen, die in der Jersey-Anwendung ausgelöst wird. Ich habe auch eine jsp, die die gleiche Art von JSON-Antwort erzeugt, die ich als Fehlerseite in der web.xml registriert, die alle Fehler abdeckt, die kommen könnten, bevor Jersey geladen wird.
Aber es gibt einen Fall, in dem weder meine Ausnahme Mapper noch mein Json Herstellung jsp arbeitet, ist, dass, wenn eine schlechte Formte json auf einen POST REST-Endpunkt senden, die nur die folgende Meldung zurück:
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Content-Type: text/plain
Content-Length: 210
Date: Tue, 24 Jun 2014 22:14:11 GMT
Connection: close
Can not deserialize instance of com.example.rest.User[] out of START_OBJECT token
at [Source: [email protected]; line: 1, column: 1]
Wie kann ich Jersey dazu bringen, stattdessen meine benutzerdefinierte Fehlerantwort zurückzugeben?
UPDATE:
Basierend auf der Antwort von @Lucasz, ich mehr Forschung getan und festgestellt, dass es zwei Ausnahme-Mapper in der Verpackung com.fasterxml.jackson.jaxrs.base definiert (https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base/src/main/java/com/fasterxml/jackson/jaxrs/base) JsonMappingExceptionMapper und JsonParseExceptionMapper scheint meine benutzerdefinierten Mapper zu überschatten.
Wie kann ich diese Mapper abmelden?
Dies ist, wie ich zur Zeit die Mapper bin Registrierung:
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.core.JsonProcessingException;
@Provider
public class JsonProcessingExceptionMapper implements ExceptionMapper<JsonProcessingException>{
public static class Error {
public String key;
public String message;
}
@Override
public Response toResponse(JsonProcessingException exception) {
Error error = new Error();
error.key = "bad-json";
error.message = exception.getMessage();
return Response.status(Status.BAD_REQUEST).entity(error).build();
}
}
und es funktionierte:
@ApplicationPath("/")
public class MyApp extends ResourceConfig{
public SyntheticAPIApp() {
packages("com.example.resource", "com.example.mapper");
register(org.glassfish.jersey.jackson.JacksonFeature.class);
}
}
Normalerweise löst ein ungültiger JSON eine 500 interne Serverfehlerantwort aus. Es sieht so aus, als ob ein Ausnahme-Mapper die JsonParseExcpetion bearbeitet und in eine 400-Antwort mit dem aus der Ausnahmebedingungsnachricht entnommenen Text konvertiert hat. –
Aber ich habe keine Ausnahme Mapper, die eine Text/plain Antwort erzeugt, scheint es, dass jemand diese Ausnahme abfängt, weil ich es nicht einmal in den Protokollen sehen – raspacorp