Есть ли хороший пример реализации проблемы zalando при весенней загрузке? - PullRequest
0 голосов
/ 11 апреля 2019

Мы используем zalando-problem для обработки исключений в нашем приложении весенней загрузки. но похоже, что наши обработчики проблем никогда не вызываются. Вместо весенней загрузки возвращается 500 Внутренняя ошибка сервера для всех исключений. Если вы можете привести несколько примеров, это будет полезно. Я не смог найти хороший пример реализации проблемы zalando при весенней загрузке

Если пользователь не вошел в систему, код выдает исключение SSOAuthenticationException.

@Immutable
public class SSOAuthenticationException extends AbstractThrowableProblem {

    private final String errorMessage;

    public SSOAuthenticationException( final String errorMessage ) {
        super( ErrorConstants.SSO_CACHE_AUTHENTICATION_FAILED, errorMessage, Status.UNAUTHORIZED );
        this.errorMessage = errorMessage;
    }

    public String getErrorMessage(){
        return errorMessage;
    }
    @Override
    public String toString() {
        return "SSOAuthenticationException{}";
    }
}

И код обработки исключений:

@ControllerAdvice
public class ExceptionTranslator implements ProblemHandling {
    @Override
    public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
        if (entity == null) {
            return entity;
        }
        Problem problem = entity.getBody();
        if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
            return entity;
        }
        ProblemBuilder builder = Problem.builder()
            .withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
            .withStatus(problem.getStatus())
            .withTitle(problem.getTitle())
            .with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());

        if (problem instanceof ConstraintViolationProblem) {
            builder
                .with("violations", ((ConstraintViolationProblem) problem).getViolations())
                .with("message", ErrorConstants.ERR_VALIDATION);
        } else {
            builder
                .withCause(((DefaultProblem) problem).getCause())
                .withDetail(problem.getDetail())
                .withInstance(problem.getInstance());
            problem.getParameters().forEach(builder::with);
            if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
                builder.with("message", "error.http." + problem.getStatus().getStatusCode());
            }
        }
        return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
    }

    @ExceptionHandler(SSOAuthenticationException.class)
    @ResponseBody
    public ResponseEntity<Problem> handleUnAuthenticatedUser(SSOAuthenticationException ex, NativeWebRequest request) {
        Problem problem = Problem.builder()
            .withStatus(Status.UNAUTHORIZED)
            .with("message", ErrorConstants.SSO_CACHE_AUTHENTICATION_FAILED)
            .build();
        return create(ex, problem, request);
    }
}

Когда я запускаю в отладчике, я замечаю, что обработчик исключений никогда не вызывается. вместо этого код думает, что обработчик не зарегистрирован (в ServletInitialHandler.java он переходит в раздел else, который исключение не обрабатывается) и изменяет код состояния на INTERNAL_SERVER_ERROR. Таким образом, для всех исключений приложение выдает ошибку 500. Что не так в коде обработки исключений? Нужно ли включать AdviceTrait? Я тоже это попробовал. но похоже, что это тоже не работает. Если вы могли бы объяснить правильный способ обработки этого исключения и пример, это поможет. Спасибо

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