Массив продолжает добавлять то же значение в перехватчик - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь создать простой перехватчик, который проверяет, указал ли пользователь атрибут языка в заголовках или нет. Я все настроил, и все работает хорошо, но если я отправляю запрос более одного раза, я вижу, что сообщение об ошибке снова добавляется в массив и теперь отображается дважды.

Это код для Перехватчик:

public class LanguageInterceptor extends HandlerInterceptorAdapter {

    private List errors = new ArrayList();
    private BadRequestException badRequestException = new BadRequestException();
    private BadRequestExceptionData badRequestExceptionData = new BadRequestExceptionData();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String LocaleLang = request.getHeader("Accept-Language");
        if(null == LocaleLang) {
            badRequestException.setStatus(HttpStatus.BAD_REQUEST.value());
            badRequestException.setTitle("Illegal request");
            errors.add("No language attribute specified in your request!");
            badRequestExceptionData.setPageSize(errors);
            badRequestException.setErrors(badRequestExceptionData);

            ObjectMapper objectMapper = new ObjectMapper();
            response.setStatus(HttpStatus.BAD_REQUEST.value());
            response.getWriter().write(objectMapper.writeValueAsString(badRequestException));
            response.setHeader("Content-Type", "application/json");
            return false;
        }
        return true;
    }
}

Пример ответа:

{
    "status": 400,
    "errors": {
        "pageSize": [
            "No language specified in your request!",
            "No language specified in your request!"
        ]
    },
    "title": "Illegal request"
}

Я делаю что-то не так или мне нужно очистить объект после выполнения функции preHandle? Приношу свои извинения, если этот вопрос звучит немного скучно, я все еще новичок в Java и Spring boot.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Похоже, что LanguageInterceptor был создан как синглтон . Сдвиньте все эти три переменные внутри метода, preHandle, чтобы сделать их локальными вместо переменных экземпляра .

List errors = new ArrayList();
BadRequestException badRequestException = new BadRequestException();
BadRequestExceptionData badRequestExceptionData = new BadRequestExceptionData();
0 голосов
/ 07 апреля 2020

LanguageInterceptor - это одноэлементный компонент, список ошибок будет сохранять статус при каждом запросе.

Вы можете решить эту проблему, объявив список внутри метода.

Кроме того, я рекомендую вам сделать то же самое для исключений.

...