#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