Nano Hash - криптовалюты, майнинг, программирование

Выброс CustomError с сервера не возвращается в HttpErrorResponse на стороне клиента

Привет, я новичок в Spring и Angular. Я создаю Java-сервер Spring и клиент angular. По сути, я хочу, чтобы клиент мог перехватить исключение, выброшенное с сервера. Я определил класс CustomExeption.java и у меня есть CustomRestExcepotionHandler.java на стороне сервера. Прямо сейчас я не уверен, где я должен выбросить исключение на сервере, чтобы клиент мог его поймать.

Я следил за учебником: https://www.baeldung.com/global-error-handler-in-a-spring-rest-api

Теперь он возвращает мне сообщение об ошибке 500 Internal Server Error на клиентскую сторону в HttpErrorResponse.

Я хочу, чтобы он возвращал мое сообщение об исключении клиента. Может ли кто-нибудь помочь мне узнать, есть ли проблемы с серверным кодом. почему HttpErrorResponse не улавливает исключение CustomException? Спасибо!

 public class ApiError {

    private HttpStatus status;
    private String message;
    private List<String> errors;

    public ApiError(HttpStatus status, String message, List<String> errors) {
        super();
        this.status = status;
        this.message = message;
        this.errors = errors;
    }

    public ApiError(HttpStatus status, String message, String error) {
        super();
        this.status = status;
        this.message = message;
        errors = Arrays.asList(error);
    }

    public HttpStatus getStatus() {
        // TODO Auto-generated method stub
        return status;
    }

    public String getMessage() {
        // TODO Auto-generated method stub
        return message;
    }
}
---

-------------------- ExceptionHandler

@ControllerAdvice
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
            HttpStatus status, WebRequest request) {

         ApiError apiError = 
                  new ApiError(status, ex.getMessage(), ex.getMessage());
                return handleExceptionInternal(
                  ex, apiError, headers, apiError.getStatus(), request);
            }

    protected ResponseEntity<Object> handleResponseStatusException(ResponseStatusException ex,Object body, HttpHeaders headers,
            HttpStatus status, WebRequest request ){
         ApiError apiError = 
                  new ApiError(status, ex.getMessage(), ex.getMessage());
         return handleExceptionInternal(
                  ex, apiError, headers, apiError.getStatus(), request);
            }

}

public ResponseEntity<AtlasJWT> signInUser(String userName, String password) {String userId = "(uid=" + userName + ")";
if (ldapTemplate.authenticate("", userId, password)) {
                log.info("ldapTemplate.authenticate returned true");

                Optional<AtlasUser> optLoggedInUser = userRepository.findByUsername(userName);
                AtlasJWT atlasJwtToken = jwtTokenProvider.createAtlasJwtToken(optLoggedInUser.get());
                if (optLoggedInUser.isPresent()) {
                    log.info("Atlas JWT: {}", atlasJwtToken);
                    return new ResponseEntity<AtlasJWT>(atlasJwtToken, HttpStatus.OK);
                } else {
                    //ApiError error = new ApiError(HttpStatus.BAD_REQUEST,"No such User found in the Atlas Database","No such User found in the Atlas Database");
                    throw new CustomException("No such User found in the Atlas Database",HttpStatus.FORBIDDEN);
                }

            } else {
                //ApiError error = new ApiError(HttpStatus.FORBIDDEN,"Invalid username/password supplied","Invalid username/password supplied");
                throw new CustomException("Invalid username/password supplied", HttpStatus.FORBIDDEN);

            }

    }

Компонент входа в систему на стороне клиента выглядит следующим образом:

  login(username: string, password: string) {
    console.log('Inside AuthenticationService. Username: ', username);

    // const body = `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}&grant_type=password`;

    const body = {
      'username': username,
      'password': password
    };

    const httpOptions = {
      headers: new HttpHeaders({
          'Content-Type': 'application/json',
      })
    };

    console.log('Invoking server authentication for username', username);

    return this.http.post<AtlasJWT>('/auth/api/signin', body, httpOptions).pipe(catchError(this.handleError));
  }

   private handleError(err: HttpErrorResponse) {
    // in a real world app, we may send the server to some remote logging infrastructure
    // instead of just logging it to the console
    let errorMessage = '';
    if (err.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      errorMessage = err.message;
      // console.log(err);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
      console.log(err);
    }
    console.error(errorMessage);
    return throwError(errorMessage);
  }

Ответы:


1

Я чувствую, что это помогло. Добавлены аннотации @ResponseBody и @ResponseStatus.

введите описание изображения здесь

И я также пробую этот код, добавленный в мой класс контроллера. Оба работают

@ExceptionHandler(CustomException.class)
public HttpEntity<String> exceptionHandler(CustomException custEx ) {
    return new HttpEntity<String>(custEx.getMessage()) ;
}
29.01.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..