Игнорировать ошибочные данные из заданного списка, когда включен обработчик исключений Global Spring - PullRequest
0 голосов
/ 07 марта 2019

Рассмотрим сценарий, в котором мы должны запустить цикл с 10 сообщениями. Во время итерации, если 5-е сообщение не удается из-за какого-то исключения, запрос направляется в Global Exception Handler. Из-за этого остальные сообщения не обрабатываются.

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

Глобальный обработчик исключений с помощью Spring

@EnableWebMvc
@ControllerAdvice
public class ExceptionHandlerUtil
{

    public static final Logger LOGGER = Logger.getLogger( ExceptionHandlerUtil.class.getPackage().getName() );

    @ExceptionHandler( Exception.class )
    public @ResponseBody ExceptionDTO commonExceptionHandler( Exception e , HttpServletRequest request , HttpServletResponse response ) throws IOException, JSONException
        {
            LOGGER.log( Level.SEVERE , FullHistoryUtil.printException( e ) );
            ExceptionDTO exceptionDTO = new ExceptionDTO();
            exceptionDTO.setStatus( 500 );
            exceptionDTO.setMessage( e.toString() );
            response.setStatus( 500 );
            NotificationServiceImplementation notificationService = new NotificationServiceImplementation();
            notificationService.sendExceptionNotification( e , request , 86400 , true );
            return exceptionDTO;
        }

Наш Контроллер

@RequestMapping( value = “/messages/bulk” , method = RequestMethod.POST , consumes = "application/json; charset=utf-8" )
    public @ResponseBody InteractionResponseDTO persistInteraction( @RequestBody String interactionJSON , HttpServletRequest request )  throws JSONException , IOException , IllegalAccessException , InvocationTargetException , UnprocessableEntityException
        {
            return interaction.persistInteractionService( interactionJSON , request );
        }

Рассмотрим внутри persistInteractionService Я перебираю список из 10 сообщений. Но 5-е сообщение вызвало какое-то исключение, управление переходит к глобальному обработчику исключений. Я не могу запустить остальные сообщения (т. Е. От 6 до 10).

1 Ответ

1 голос
/ 07 марта 2019

Рассмотрим , собираем эти исключения в вашем методе обслуживания.

Я бы определил пользовательское исключение, способное собирать любое исключение внутри вашего цикла for, а затем выбрасывать его, только если оно собрало какие-либо.

Пример реализации может быть следующим:

IteractionMultiException.java

public class IteractionMultiException extends Exception {
    private final Map<IntegrationMessage, Exception> exceptions = new HashMap<>();

    public void addException(IntegrationMessage message, Exception exception) {
        exceptions.put(message, exception);
    }

    public boolean hasCatched() {
        return exceptions.isEmpty();
    }
}

метод persistInteractionService

public InteractionResponseDTO persistInteractionService(String interactionJSON , HttpServletRequest request) {
    IteractionMultiException multiException = new IteractionMultiException();
    InteractionResponseDTO response = null;

    Collection<IntegrationMessage> integrationMessages = getIntegrationMessages(interactionJSON);
    for (IntegrationMessage message : integrationMessages) {
        try {
            // your logic here
        } catch(Exception e) {
            multiException.addException(message, e);
        }
    }

    if (multiException.hasCatched()) {
        throw multiException;
    }

    return response;
}

Это решение может сильно различаться в зависимости от логики вашего сервиса, но я надеюсь, что это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...