Как заменить устаревшую функцию ErrorController на Spring Boot? - PullRequest
0 голосов
/ 17 июня 2020

У вас есть собственный контроллер ошибок при загрузке Spring:

package com.example.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.boot.web.servlet.error.ErrorController;
import javax.servlet.http.HttpServletRequest;


@Controller
public class CustomErrorController implements ErrorController
{
    @RequestMapping("/error")
    public String handleError(HttpServletRequest request)
    {
        ...
    }

    @Override
    public String getErrorPath()
    {
        return "/error";
    }
}

Но при компиляции отображается: getErrorPath() in ErrorController has been deprecated. Хорошо, я нашел информацию: используйте свойство server.error.path. Хорошо, добавьте это в application.properties и удалите функцию, но теперь говорит: CustomErrorController is not abstract and does not override abstract method getErrorPath() in ErrorController, ¿нужна устаревшая функция?.

Как сделать настраиваемый контроллер ошибок ?, ErrorController требует getErrorPath но он устарел, какова правильная альтернатива?.

Ответы [ 3 ]

0 голосов
/ 18 июня 2020
  1. Для обработки ошибок нет необходимости определять класс контроллера, реализующий контроллер ошибок.
  2. Для обработки ошибок во всем приложении вместо записи

    @Controller
     public class CustomErrorController implements ErrorController{
      @RequestMapping("/error")
      public String handleError(HttpServletRequest request)
        {
        ...
        }
      }
    

используйте класс ниже

@ControllerAdvice
 public class myExceptionHandler extends ResponseEntityExceptionHandler {

  @ExceptionHandler(Exception.class)
  public final ResponseEntity<YourResponseClass> handleAllExceptions(Exception ex, WebRequest request) {
    YourResponseClassexceptionResponse = new YourResponseClass(new Date(), ex.getMessage());// Its an example you can define a class with your own structure
    return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
  }

  @ExceptionHandler(CustomException.class)
  public final ResponseEntity<YourResponseClass> handleAllExceptions(Exception ex, WebRequest request) {
    YourResponseClass exceptionResponse = new YourResponseClass(new Date(), ex.getMessage()); // For reference 
    return new ResponseEntity<YourResponseClass>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
  }

   @ExceptionHandler(BadCredentialsException.class)
  public final ResponseEntity<YourResponseClass> handleBadCredentialsException(BadCredentialsException ex, WebRequest request){
        YourResponseClass exceptionResponse = new YourResponseClass(new Date(), ex.getMessage());// For refernece 
            return new ResponseEntity<>(exceptionResponse, HttpStatus.UNAUTHORIZED);          
  }  

}

Класс выше, помеченный @ControllerAdvice, действует как пользовательский обработчик исключений и обрабатывает все исключения, создаваемые приложением ur. В приведенном выше примере кода для понимания показаны только три исключения. Он может обрабатывать множество исключений

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

0 голосов
/ 20 августа 2020

Начиная с версии 2.3.x, при загрузке Spring этот метод устарел. Просто верните null, так как он в любом случае будет проигнорирован. Не используйте аннотацию @Override, если вы хотите предотвратить будущую ошибку компиляции, когда метод полностью удален. Вы также можете подавить предупреждение об устаревании, если хотите, однако предупреждение (также аннотация @Override) полезно для напоминания вам о необходимости очистки / исправления кода при удалении метода.

@Controller
@RequestMapping("/error")
@SuppressWarnings("deprecation")
public class CustomErrorController implements ErrorController {

     public String error() {
        // handle error
        // ..
     }

     public String getErrorPath() {
         return null;
     }
}
0 голосов
/ 17 июня 2020

есть @ControllerAdvice аннотация

@ControllerAdvice
public class MyErrorController {


   @ExceptionHandler(RuntimeException.class)
   public String|ResponseEntity|AnyOtherType handler(final RuntimeException e) {
     .. do handle ..
   }

   @ExceptionHandler({ Exception1.class, Exception2.class })
   public String multipleHandler(final Exception e) {

   }

}
...