Как включить h2-консоль в spring-webmvc без spring-boot?

#java #spring #spring-mvc #h2 #spring-jdbc

#java #весна #spring-mvc #h2 #spring-jdbc

Вопрос:

Мое приложение строится с spring-webmvc и spring-jdbc без spring-boot . В моем application.properties у меня есть:

 spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

datasource.dbname=users
datasource.script=classpath:resources/users.sql
  

Но он не запускается h2-console , потому что у меня его нет spring-boot-devtools , но нужно ли мне это? Итак, я добавил серверный компонент из org.h2.tools пакета следующим образом:

 // The web server is a simple standalone HTTP server that
// implements the H2 Console application.  localhost:8082
@Bean(initMethod = "start", destroyMethod = "stop")
public Server h2Server() throws SQLException {
    return Server.createWebServer();
}
  

И теперь я могу получить доступ к веб-консоли localhost:8082 и подключиться к jdbc:h2:mem:users ней, но я думаю, что это не решение, а обходной путь, потому что я добавил DataSource компонент, используя EmbeddedDatabaseBuilder вот так:

 @Bean
public DataSource dataSource(
        @Value("${datasource.dbname}") String dbname,
        @Value("${datasource.script}") String script) {

    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .setName(dbname)
            .addScript(script)
            .build();
}
  
 @Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}
  

Есть ли весенний способ включить h2-console spring-webmvc без spring-boot ? Или это обычный способ включить его?

pom.xml:

 <!-- spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.9.RELEASE</version>
</dependency>

<!-- h2 database -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

<!-- servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
  

Ответ №1:

Похоже, вам нужно зарегистрировать a org.h2.server.web.WebServlet для сопоставления с сервлетом.

Из комментариев в WebServlet:

Этот сервлет позволяет использовать консоль H2 в стандартном контейнере сервлетов, таком как Tomcat или Jetty.

Смотрите также:

Ответ №2:

Spring Boot заботится о магии регистрации сервлета h2-console, но это довольно легко решить с помощью vanilla spring (не spring-boot), используя любую реализацию «WebApplicationInitializer», такую как «AbstractSecurityWebApplicationInitializer». Например, добавление сервлета диспетчера и h2-консоли в средах Servlet 3.0 (нет web.xml ):

 public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext container) {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class, SecurityConfig.class, WebConfig.class);
        context.setServletContext(container);
        ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context));
        servlet.setInitParameter("throwExceptionIfNoHandlerFound", "true");
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");

        ServletRegistration.Dynamic h2Console = container.addServlet("h2-console", new WebServlet());
        h2Console.setInitParameter("-webAllowOthers", "");
        h2Console.setLoadOnStartup(1);
        h2Console.addMapping("/h2/*", "/h2-console/*");
    }
}
  

Без spring-boot вам нужно будет вручную настроить зависимости maven (или gradle) для всего веб-уровня Spring, включая те библиотеки, которые требуются Tomcat (если они не встроены) и, естественно, зависимость h2:

 <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>${h2.version}</version>
</dependency>
  

Ответ №3:

Во-первых, вам нужно определить dataSource

     @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .generateUniqueName(false)
            .setName("testdb")
            .setType(EmbeddedDatabaseType.H2)
            .setScriptEncoding("UTF-8")
            .ignoreFailedDrops(true)
            .addScripts("sqlscripts/schema.sql", "sqlscripts/data.sql")
            .build();
    }
  

Затем вы можете реализовать WebApplicationInitializer и переопределить onStartup

 import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.h2.server.web.WebServlet;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

public class ApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //bootstrap dispatcher servlet
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(ApplicationConfig.class); // whatever config that you want to register

        ServletRegistration.Dynamic h2ServletRegistration = servletContext.addServlet(
            "h2-console",
            new WebServlet()
        );
        h2ServletRegistration.setLoadOnStartup(1);
        h2ServletRegistration.addMapping("/console/*");
    }
}
  

И поскольку вы используете h2ServletRegistration.addMapping("/console/*"); , не забудьте получить доступ к h2-console через шаблон URL, например http://localhost:8080/<app-name>/console

Моя версия spring 5.3.16 , а h2 2.1.210