2016-02-27 3 views
2

Я работаю над приложением, для которого мне нужно было построить ответ, если в запросе будет отправлена ​​недопустимая полезная нагрузка JSON.Jersey Custom Exception Mapper для Invalid Json String

В настоящее время сообщение исключения получил на стороне сервера является Неожиданный символ («"»(код 34)): ожидал запятые для разделения записей OBJECT в [Источник: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $ UnCloseableInputStream @ 310db662; строка: 13, колонка 7]

Это, как я пытаюсь достичь этого ...

import java.util.ArrayList; 
import java.util.List; 

import javax.validation.ConstraintDeclarationException; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

@Provider 
public class JsonParseExceptionMapper implements ExceptionMapper<JsonProcessingException> { 

    private static Logger logger = LogManager.getLogger(JsonParseExceptionMapper.class.getName()); 

    @Override 
    public Response toResponse(final JsonProcessingException ex) { 

     System.out.println("inside json parse exception mappper"); 

     logger.error(messages.toString()); 
     return Response.status(Response.Status.BAD_REQUEST).entity(messages).type(MediaType.APPLICATION_JSON).build(); 
    } 
} 

у меня также есть подобный ExceptionMapper, который ловит ConstraintViolationException, который

Я также попробовал несколько различных исключений, как это предлагается через Интернет, чтобы назвать несколько

JsonProcessingException 
BadRequestException 
JsonParseException 
InvalidFormatException 
ConstraintDeclarationException 

Но ни один из вышеуказанных исключений не похоже на работу в этом случае. Кто-нибудь знает, какое исключение следует использовать вместе с ExceptionMapper, чтобы поймать такие случаи.
Кроме того, я думаю, возможно иметь несколько реализаций ExceptionMapper, работающих параллельно друг другу. Пожалуйста, исправьте, если я ошибаюсь.

Edit: Это то, что я имею в виду недопустимой JSON Payload, обратите внимание на недостающую запятую перед контрольной суммой

{ 
    "payload": { 
     "name":"rachel", 
     "employeeid":"23443" 
    } 
    "checksum":"" 
} 

Джерси v2.22.1
Spring v4.2.4-РЕЛИЗ

По какой-то причине я не могу комментировать какие-либо сообщения !!! Даже в окне редактирования есть проблемы, я не вижу иконки!

Я также пытался использовать RuntimeException, Exception и IOException, но ExceptionMapper тоже не работал для них. Думаю, для этого требуется определенное время исключения, например ConstraintViolationException, которое используется с другим ExceptionMapper, и что он работает нормально.

некоторая часть web.xml jersey.config.beanValidation.enableOutputValidationErrorEntity.server правда jersey.config.server.disableMoxyJson правда

+0

Вы зарегистрировали картупер в конфиге? Какой json-парсер вы используете? – Derlin

+0

Да, картограф зарегистрирован с помощью @Provider. Я использую codehaus и использую Spring для DI. Джерси v 2.22.1 –

+0

Для меня это выглядит так, что код, который вы предоставили, является правильным (за исключением отсутствия импорта для JsonProcessingException, которое вызвано, по моему мнению, изменением сообщения здесь, на сайте). Вы можете попытаться поймать IOException или даже Exception/RuntimeException, чтобы убедиться, что провайдер вызывается вообще. Также убедитесь, что он находится внутри \t 'jersey.config.server.provider.classpath' (https://jersey.java.net/documentation/latest/appendix-properties.html) – Grief

ответ

3

Изначально я зарегистрировал JacksonFeature.class для Json Парсинга который использует собственный ExceptionMapper для JsonParseException.

Я изменил его на JacksonJaxbJsonProvider.class.

Теперь я могу использовать свой пользовательский JsonParseExceptionMapper.

Пришлось менять определенные зависимости !!

+0

Чувак, вы только что спасли мне жизнь. .. Я использую Jersey и Embedded Jetty, поэтому мне пришлось это сделать: 'final ResourceConfig resourceConfig = new ResourceConfig (JacksonJaxbJsonProvider.class); resourceConfig.packages (ПАКЕТЫ); ' –

+0

приятно знать. счастливое кодирование. –