【问题标题】:Close context implicitly in Java EE在 Java EE 中隐式关闭上下文
【发布时间】:2021-02-23 13:47:31
【问题描述】:

我正在尝试在 Java EE 8 (Java 11) 中实现以下代码以访问 Wildfly 20 中的数据源。目标是隐式关闭 JNDI 上下文和 SQL 连接:

try (InitialContext context = new InitialContext();
     Connection conn = ((DataSource) context.lookup(pool)).getConnection()) {
    
      // use the connection

} 
catch (NamingException e) {
    logger.error(e.getMessage());
} 
catch (SQLException e) {
    logger.error(e.getMessage());
}

问题是上下文不可关闭,因为我收到编译错误:

The resource type InitialContext does not implement java.lang.AutoCloseable

我试图避免添加finally 来关闭上下文,有没有办法实现这一点?

【问题讨论】:

    标签: java wildfly java-11 java-ee-8


    【解决方案1】:

    Try-with-resources 仅适用于 AutoCloseable 的对象。在不使用finally 的情况下执行此操作的一种方法是将InitialContext 包装在实现AutoCloseable 的包装器中,该包装器在其close() 方法中执行必要的操作。像这样的:

    public class AutoCloseableWrapper implements AutoCloseable {
    
        private final InitialContext context;
    
        public AutoCloseableWrapper(InitialContext context) {
            this.context = context;
        }
    
        public InitialContext getContext() {
            return this.context;
        }
    
        @Override
        public void close() throws Exception {
            this.context.close();
        }
    }
    

    像这样使用它:

    try (AutoCloseableWrapper wrapper = new AutoCloseableWrapper(new InitialContext());
         Connection conn = ((DataSource) wrapper.getContext().lookup(pool)).getConnection()) {
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-15
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2011-02-20
      相关资源
      最近更新 更多