Специально для этих двух эндпоинтов я создал контроллер:
package com.example.demo.controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @RestController public class ShutdownController { @RequestMapping(value = "/exit", method = RequestMethod.GET) public ModelAndView exit() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("redirect:/exit-success"); return modelAndView; } @GetMapping("/exit-success") public String shutdownContext() { return "<H2>The application is closed</H2>"; } }
А на метод, обрабатывающий запросы к /exit-success повесил аспект
package com.example.demo.advice; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; @Aspect @Component public class ShutdownAspect implements ApplicationContextAware{ private ApplicationContext context; @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { this.context = ctx; } @Pointcut("execution(* com.example.demo.controller.ShutdownController.shutdownContext(..))") private void shutdown(){} @After("shutdown()") public void afterAdvice(JoinPoint joinPoint) { ((ConfigurableApplicationContext) context).close(); } }
Так вот - происходит все что нужно, кроме отображения надписи, что приложение закрыто. Если же я аспект убираю, то наоборот, надпись отображается, но приложение уже, ясное дело, не закрывается. Такое чувство, что аспект не дает закончить фреймворку до конца сформировать страницу. Что же тогда можно тут сделать?