создать контроллер ошибок, который сохранит функциональность контроллера ошибок по умолчанию - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно реализовать error controller, который будет вести себя определенным образом только для одного случая - когда он пытается отобразить whitelabel error page. В других случаях он должен вести себя как обычный BasicErrorController, который использует Spring Boot.

Мой текущий контроллер, кажется, принимает на себя каждый запрос и даже вызывает перенаправление при базовой ошибке 401, несмотря на наличие restexceptionhandler.

@Controller
@RequestMapping("/error")
public class ErrorPageController implements ErrorController {
    private static final String LOCALHOST_SERVER_NAME = "localhost";
    private static final Logger LOGGER = LoggerFactory.getLogger(ErrorPageController.class);
    private static final String REDIRECT_FORMAT = "redirect:%s://%s%s";
    private static final String LOCALHOST_REDIRECT_FORMAT = "redirect:%s://%s:%d%s";

    @Value("${server.error.page.internalErrorPage}")
    private String internalErrorPage;

    @GetMapping(produces = "text/html")
    public String handleGetError(HttpServletRequest request) {
        return handleError(request);
    }

    @PutMapping(produces = "text/html")
    public String handlePutError(HttpServletRequest request) {
        return handleError(request);
    }

    @PostMapping(produces = "text/html")
    public String handlePostError(HttpServletRequest request) {
        return handleError(request);
    }

    @DeleteMapping(produces = "text/html")
    public String handleDeleteError(HttpServletRequest request) {
        return handleError(request);
    }

    private String handleError(HttpServletRequest request) {
        String redirectUrl;
        if (LOCALHOST_SERVER_NAME.equals(request.getServerName())) {
            redirectUrl = String.format(LOCALHOST_REDIRECT_FORMAT, request.getScheme(), request.getServerName(),
                request.getServerPort(), internalErrorPage);
        } else {
            redirectUrl = String.format(REDIRECT_FORMAT, request.getScheme(), request.getServerName(),
                internalErrorPage);
        }

        return redirectUrl;
    }

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

Однако, когда я пытаюсь расширить BasicErrorController, и это заставляет меня определить конструктор

public ErrorPageController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) {
    super(errorAttributes, errorProperties);
}

Кажется, он не может создать экземпляр объекта со свойствами ошибки.

Parameter 1 of constructor in com.xxx.handler.ErrorPageController required a bean of type 'org.springframework.boot.autoconfigure.web.ErrorProperties'

В чем проблема? То, что я хочу, это просто перенаправление, когда запрос не прошел и он пришел с /api/oauth URL, оставив другие работающие как есть.

1 Ответ

0 голосов
/ 15 июня 2019

То, что я хочу, это просто перенаправление, когда запрос пришел с / api / oauth URL, оставляя другие работающие как есть.

Почему бы вам просто не определить фильтр?

@Component
public class SimpleFilter implements Filter {
   @Override
   public void destroy() {}

   @Override
   public void doFilter
      (ServletRequest request, ServletResponse response, FilterChain filterchain) 
      throws IOException, ServletException {

       // do the redirect here
   }

   @Override
   public void init(FilterConfig filterconfig) throws ServletException {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...