Использование Spring Boot 2 Я хочу создать отображение запросов на основе базы данных. Я имею в виду, вместо использования сотен аннотаций @RequestMapping
на контроллерах, я хотел бы сохранить отображение в таблице базы данных.
Каждый из контроллеров реализует интерфейс, который имеет метод execute, поэтому я просто ищу соответствующий контроллер в БД и вызываю метод execute для него.
На данный момент у меня есть CustomController
с @RequestMapping("*")
, и этот контроллер находит настоящий контроллер и вызывает метод execute. Это работает, но это не очень хорошее решение. Например, на уровне перехватчика объектом-обработчиком является CustomController
, а не реальный контроллер.
Вероятно, я должен использовать SimpleUrlHandlerMapping
так:
@Bean
public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
Map<String, Object> urlMap = new HashMap<>();
urlMap.put("/dashboard", __???__);
simpleUrlHandlerMapping.setUrlMap(urlMap);
return simpleUrlHandlerMapping;
}
Но в этом случае я не знаю, как заполнить значение бина в urlMap
. Например, в случае "/ приборной панели", как поставить DashboardController.execute()
.
Может быть, есть лучшее решение?
ОБНОВЛЕНИЕ 1
Я создал SimpleUrlHandlerMapping
вот так:
@Configuration
public class SimpleUrlHandlerMappingConfig {
@Autowired
private ApplicationContext context;
@Bean
public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
Map<String, Object> urlMap = new HashMap<>();
String path = "/dashboard";
String controllerName = "dashboardController";
Object myController = context.getBean(controllerName);
urlMap.put(path, myController);
simpleUrlHandlerMapping.setUrlMap(urlMap);
return simpleUrlHandlerMapping;
}
}
и CustomHandlerAdapter
как:
@Configuration
public class CustomHandlerAdapter implements HandlerAdapter {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean supports(Object handler) {
logger.debug("Test handler: " + handler);
if (handler instanceof PageController) {
return true;
}
return false;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("Custom handle");
ModelAndView mv = new ModelAndView();
String viewName = ((PageController)handler).execute2(request, response);
mv.setViewName(viewName);
return mv;
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
Но по логам кажется, что SimpleUrlHandlerMapping
работает неправильно:
- DispatcherServlet with name 'dispatcherServlet' processing GET request for [/dashboard]
- Looking up handler method for path /dashboard
- Did not find handler method for [/dashboard]
- Matching patterns for request [/dashboard] are [/**]
- URI Template variables for request [/dashboard] are {}
- Mapping [/dashboard] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@4bc6044e]]] and 1 interceptor
- Test handler: ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@4bc6044e]]
- Last-Modified value for [/dashboard] is: -1
ОБНОВЛЕНИЕ 2
Благодаря @M. Deinum
я обновил свой код и у меня есть работающее решение.
Обратите внимание, что @EnableWebMvc
был введен, и это может вызвать другие побочные эффекты позже.
SimpleUrlHandlerMappingConfig:
@Configuration()
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleUrlHandlerMappingConfig {
@Autowired
private ApplicationContext context;
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
Map<String, Object> urlMap = new HashMap<>();
String path = "/dashboard";
String controllerName = "dashboardController";
Object myController = context.getBean(controllerName);
urlMap.put(path, myController);
simpleUrlHandlerMapping.setUrlMap(urlMap);
return simpleUrlHandlerMapping;
}
}
CustomHandlerAdapter:
@Component
public class CustomHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
if (handler instanceof PageController) {
return true;
}
return false;
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
ModelAndView mv = new ModelAndView();
String viewName = ((PageController)handler).execute2(request, response);
mv.setViewName(viewName);
return mv;
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
И WebConfig:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/style/**")
.addResourceLocations("classpath:" + "/static/style/");
registry.addResourceHandler("/js/**")
.addResourceLocations("classpath:" + "/static/js/");
}
}