Я использую Jersey 2.10 с функцией сериализации/десериализации Jackson в моем REST API.
Моя идея - заставить мой REST API всегда возвращать стандартный ответ об ошибке JSON. Для этого у меня есть классы ExceptionMapper, которые создают правильные ответы об ошибках json для любого исключения, которое бросается в приложение Джерси. У меня также есть jsp, который производит такой же ответ JSON, который я зарегистрировал как страницу с ошибкой в web.xml, который охватывает все ошибки, которые могут возникнуть до загрузки Джерси.
Но есть один случай, когда ни мои контролеры исключений, ни мой json, создающий jsp, не работают, то есть при отправке плохо сформированного json в конечную точку POST REST, которая возвращает только следующее сообщение:
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]
Как я могу заставить Джерси вернуть свой пользовательский ответ об ошибке вместо этого?
UPDATE:
Основываясь на ответе @Lucasz, я сделал больше исследований и обнаружил, что в пакете определены два экземпляра исключения. com.fasterxml.jackson.jaxrs.base(https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base/src/main/java/com/fasterxml/jackson/jaxrs/base) JsonMappingExceptionMapper и JsonParseExceptionMapper, которые, кажется, затеняют мои настраиваемые карты.
Как я могу отменить регистрацию этих карт?
Вот как я сейчас регистрирую mappers:
@ApplicationPath("/")
public class MyApp extends ResourceConfig{
public SyntheticAPIApp() {
packages("com.example.resource", "com.example.mapper");
register(org.glassfish.jersey.jackson.JacksonFeature.class);
}
}