Spring Boot - отображение запросов на основе базы данных - PullRequest
0 голосов
/ 30 октября 2018

Использование 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/");

    }
}   

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я выкладываю окончательное решение (спасибо М. Дейну) здесь, возможно, помогая кому-то еще.

Итак, я создал HandlerMapping, используя 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);

        simpleUrlHandlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return simpleUrlHandlerMapping;
    }

}

И кастом HandlerAdapter:

@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;
    }
}

Обратите внимание, что этот пример демонстрирует только концепцию без надлежащей обработки ошибок и реального доступа к БД.

0 голосов
/ 30 октября 2018

Если я правильно понял, вы хотите избавиться от простых действий (get / post / put / delete) - и они только вызывают методы save / find / delete из репозитория. Если это так, я предлагаю использовать Spring Data REST

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...