spring H2控制台错误:未找到适用于08001/0的驱动程序

0s0u357o  于 2023-03-07  发布在  Spring
关注(0)|答案(7)|浏览(228)

您好,我在H2控制台数据库中查看架构时遇到问题:
我使用 Spring Boot :

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:~/test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MV_STORE=FALSE;MVCC=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

这是我的登录页面:

所以我在里面看到的是标准的控制台视图,没有我的表,但我的应用程序工作正常。

unhi4e5o

unhi4e5o1#

通常“测试连接”是工作的(登录表单后的绿色线),但连接不工作。这可能是由处理头文件引起的,这可能是由过滤器或安全配置引起的。例如,我被这个击中了两次:
1.我有相同的症状,问题是由使用日志记录引起的。删除依赖项有助于在登录到h2-console时消除“找不到适用于08001/0的驱动程序”消息:

<dependency>
    <groupId>org.zalando</groupId>
    <artifactId>logbook-spring-boot-starter</artifactId>
</dependency>

我不确定这是否是给定project的bug,或者是错误的用法/配置。
1.配置OAuth2也让我很吃惊。我需要从Web和HTTP安全中排除h2-console uri。请参阅一些info here。请参阅片段:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
        securedEnabled = true,
        jsr250Enabled = true,
        prePostEnabled = true
)
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/h2-console/**");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // only part of config is shown here...
                .authorizeRequests()
                .antMatchers("/",
                        "/error",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js",
                        "/h2-console/**")
                .permitAll()
                .antMatchers("/auth/**", "/oauth2/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login();
    }
}
lf3rwulv

lf3rwulv2#

在我的例子中,问题是我实现了一个自定义Filter(参见hereherehere),自定义HttpServletRequestWrapper需要处理表单数据(包括Driver Class输入)附带的H2控制台登录请求,并将其解析为参数:

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {

private String body;

public MyHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
    this.body = IOUtils.toString(request.getReader());
    //...
}

@Override
public Enumeration<String> getParameterNames() {
    if (!parsedParams)
        parseParams();

    List<String> result = Collections.list(super.getParameterNames());
    result.addAll(parameters.keySet());

    return Collections.enumeration(result);
}

private void parseParams() {
    if (!body.isEmpty()) {
        String[] rps = body.split("&");

        for (String rp : rps) {
            String[] kv = rp.split("=");
            try {
                parameters.put(kv[0], kv.length > 1 ? new String[]{URLDecoder.decode(kv[1], "UTF-8")} : new String[]{""});
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }

        parameters.setLocked(true);
        parsedParams = true;
    }
}

@Override
public Map<String, String[]> getParameterMap() {
    if (!parsedParams)
        parseParams();

    Map<String, String[]> s = super.getParameterMap();
    return Stream.concat(parameters.entrySet().stream(), s.entrySet().stream()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

@Override
public String getParameter(String name) {
    return parameters.get(name) != null ? parameters.get(name)[0] : super.getParameter(name);
}

@Override
public String[] getParameterValues(String name) {
    String[] s = super.getParameterValues(name);
    return ArrayUtils.addAll(s, parameters.get(name));
}
}
ni65a41a

ni65a41a3#

当我遇到这个问题时,我正在学习一个Spring Boot 教程,在这个教程中,我的 Spring 引导Maven使用了www.example.com中的以下代码application.properties:

spring.h2.console.enabled=true
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:someName

最后一行是不必要的,因为这些是 Spring Boot 完成的默认配置:

spring.datasource.url=jdbc:h2:mem:testdb  
spring.datasource.driverClassName=org.h2.Driver  
spring.datasource.username=sa  
spring.datasource.password=  
spring.h2.console.enabled=false

当我把它取下来的时候,一切都按预期工作。

xqkwcwgp

xqkwcwgp4#

只是添加了我在这里遇到的问题和解决方案,因为我没有找到任何明确的提及。
我在从Sping Boot 2.1升级到2.2时遇到了这个问题。(在测试时,我发现即使从最新的2.1.13.RELEASE切换到2.2.0.RELEASE也会出现这个问题。)
分析:我们的应用程序同时使用Jersey/JAX-RS和Spring Web。

  • 在Sping Boot 2.1中,我们的应用程序配置Jersey使用servlet过滤器(spring.jersey.type=filter),而JerseyConfig使用ServletPropertys.FILTER_FORWARD_ON_404将无法处理的请求转发给Spring Boot。
  • 对于Sping Boot 2.2,我删除了“spring.jersey.type=filter”配置,这样Jersey就使用了一个servlet,为了让它更好地与Spring Web配合,我使用@ApplicationPath(“/API”)限制了Jersey(无论如何,我们所有的JAX-RS请求都以该前缀开头)。
q0qdq0h2

q0qdq0h25#

从我的Angular 来看,这个问题与日志如何处理表单请求有关。
默认情况下,LogbookFilter会将application/x-www-form-urlencoded主体的请求与任何其他请求一样对待,也就是说,您将在日志中看到请求主体。这种方法的缺点是,您将无法使用任何HttpServletRequest.getParameter*(..)方法。有关更多详细信息,请参阅问题#94。
日志团队建议设置系统属性
从Logbook 1.5.0开始,您现在可以使用logbook.servlet.form-request系统属性指定三种策略之一,以定义Logbook如何处理这种情况:

java -jar -Dlogbook.servlet.form-request=parameter server/target/server-1.0-SNAPSHOT.jar
zsbz8rwp

zsbz8rwp6#

在我的例子中,代理错误在Idea Intellij中设置为下载数据库驱动程序

92dk7w1h

92dk7w1h7#

在H2控制台中使用整个字符串进行连接,也就是说,您只能看到自己的表格
jdbc:h2:~/测试;数据库关闭延迟= -1;数据库关闭打开退出=假;MV_存储=假;MVCC =假

相关问题