H2控制台错误:找不到08001/0的合适驱动程序

时间:2016-10-04 13:54:06

标签: java spring spring-boot h2

您好我在H2控制台数据库中查看我的架构时遇到问题:

我使用弹簧靴:

callback

这是我的登录页面:

enter image description here

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

5 个答案:

答案 0 :(得分:1)

通常“测试连接”正在工作(登录表单后的绿线),但连接不起作用。这可能是由于处理标头(由过滤器或安全性配置引起)引起的。例如,我两次被击中:

  1. 我有相同的症状,问题是由使用日志记录引起的。 消除依赖性帮助摆脱了登录到H2控制台时找不到适用于08001/0 消息的驱动程序:

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

我不确定是给定project的错误,还是使用/配置错误。

  1. 配置OAuth2的确也打了我。我需要从网络以及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();
        }
    }
    

答案 1 :(得分:0)

就我而言,问题在于我实施了自定义过滤器(请参阅hereherehere),并且自定义HttpServletRequestWrapper需要处理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));
}
}

答案 2 :(得分:0)

当我遇到此问题时,我正在遵循spring boot教程。在本教程中,我的Spring Boot指导在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

当我删除它时,一切都按预期工作。

答案 3 :(得分:0)

只需添加我在这里遇到的问题和解决方案,因为我没有发现任何明确提及。

从Spring Boot 2.1升级到2.2时遇到了这个问题。 (测试时,我发现即使从最新的2.1.13.RELEASE切换到2.2.0.RELEASE,也出现了问题。)

分析: 我们的应用程序同时使用Jersey / JAX-RS和Spring Web。 要进行这项工作:

  • 在Spring Boot 2.1上,我们的应用程序将Jersey配置为使用Servlet过滤器 使用(spring.jersey.type = filter),JerseyConfig使用ServletProperties.FILTER_FORWARD_ON_404将无法处理的请求转发给Spring Boot。 这似乎打破了Spring Boot 2.x中的h2-console。

  • 对于Spring Boot 2.2,我删除了“ spring.jersey.type = filter”配置,以便Jersey使用servlet代替。 为了使它在Spring Web上很好用,我使用@ApplicationPath(“ / api”)限制了Jersey(无论如何,我们所有的JAX-RS请求都以该前缀开头)

答案 4 :(得分:-2)

在H2控制台中使用整个字符串进行连接,即,您将只看到您的表格

  

JDBC:H 2:〜/测试; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE; MV_STORE = FALSE; MVCC = FALSE