From d8d4b6e73899bdb80b4c0c6c2a7a40a9db16501c Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Fri, 13 Jun 2025 11:35:50 +0200 Subject: [PATCH] use try-with-resources statement Signed-off-by: Vincent Potucek --- .../mail/javamail/JavaMailSenderImpl.java | 9 +------- .../cglib/core/DuplicatesPredicate.java | 14 +++++------ .../cglib/proxy/BridgeMethodResolver.java | 18 +++++++-------- .../cglib/transform/AbstractClassLoader.java | 16 +++++-------- .../core/io/AbstractResource.java | 11 +-------- .../AbstractEmbeddedDatabaseConfigurer.java | 20 ++-------------- .../jdbc/datasource/init/ScriptUtils.java | 19 ++++----------- ...stractPollingMessageListenerContainer.java | 23 ++++++++----------- ...iEntityManagerFactoryIntegrationTests.java | 6 +---- .../ResourceHttpMessageConverter.java | 22 +++++++----------- .../ResourceRegionHttpMessageConverter.java | 12 ++-------- 11 files changed, 49 insertions(+), 121 deletions(-) diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java index e89cd78e0670..c99777e91271 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java @@ -342,14 +342,7 @@ public void send(MimeMessage... mimeMessages) throws MailException { * for. Throws a {@link MessagingException} if the connection attempt failed. */ public void testConnection() throws MessagingException { - Transport transport = null; - try { - transport = connectTransport(); - } - finally { - if (transport != null) { - transport.close(); - } + try (Transport ignored = connectTransport()) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java b/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java index 23d843411fed..4815f243cd4c 100644 --- a/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java +++ b/spring-core/src/main/java/org/springframework/cglib/core/DuplicatesPredicate.java @@ -89,14 +89,12 @@ public DuplicatesPredicate(List allMethods) { continue; } InputStream is = cl.getResourceAsStream(c.getName().replace('.', '/') + ".class"); - if (is == null) { - continue; - } - try { - new ClassReader(is).accept(finder, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); - } finally { - is.close(); - } + try (is) { + if (is == null) { + continue; + } + new ClassReader(is).accept(finder, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); + } } catch (IOException ignored) { } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java b/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java index 65fcf60600f8..27abce95ea20 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/BridgeMethodResolver.java @@ -63,16 +63,14 @@ public BridgeMethodResolver(Map declToBridge, ClassLoader classLoader) { Set bridges = (Set) entry.getValue(); try { InputStream is = classLoader.getResourceAsStream(owner.getName().replace('.', '/') + ".class"); - if (is == null) { - return resolved; - } - try { - new ClassReader(is) - .accept(new BridgedFinder(bridges, resolved), - ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); - } finally { - is.close(); - } + try (is) { + if (is == null) { + return resolved; + } + new ClassReader(is) + .accept(new BridgedFinder(bridges, resolved), + ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); + } } catch (IOException ignored) {} } return resolved; diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java index b4a7583970f4..de26a0778c2e 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/AbstractClassLoader.java @@ -61,20 +61,16 @@ public Class loadClass(String name) throws ClassNotFoundException { name.replace('.','/') + ".class" ); - if (is == null) { + try (is) { + if (is == null) { - throw new ClassNotFoundException(name); + throw new ClassNotFoundException(name); - } - try { + } - r = new ClassReader(is); + r = new ClassReader(is); - } finally { - - is.close(); - - } + } } catch (IOException e) { throw new ClassNotFoundException(name + ":" + e.getMessage()); } diff --git a/spring-core/src/main/java/org/springframework/core/io/AbstractResource.java b/spring-core/src/main/java/org/springframework/core/io/AbstractResource.java index 87b98ed8ce90..888861bc9d29 100644 --- a/spring-core/src/main/java/org/springframework/core/io/AbstractResource.java +++ b/spring-core/src/main/java/org/springframework/core/io/AbstractResource.java @@ -153,8 +153,7 @@ public ReadableByteChannel readableChannel() throws IOException { */ @Override public long contentLength() throws IOException { - InputStream is = getInputStream(); - try { + try (InputStream is = getInputStream()) { long size = 0; byte[] buf = new byte[256]; int read; @@ -163,14 +162,6 @@ public long contentLength() throws IOException { } return size; } - finally { - try { - is.close(); - } - catch (IOException ex) { - debug(() -> "Could not close content-length InputStream for " + getDescription(), ex); - } - } } /** diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java index 62e89c4a2079..705810da804e 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java @@ -40,31 +40,15 @@ abstract class AbstractEmbeddedDatabaseConfigurer implements EmbeddedDatabaseCon @Override public void shutdown(DataSource dataSource, String databaseName) { - Connection con = null; - try { - con = dataSource.getConnection(); + try (Connection con = dataSource.getConnection()) { if (con != null) { try (Statement stmt = con.createStatement()) { stmt.execute("SHUTDOWN"); } } - } - catch (SQLException ex) { + } catch (SQLException ex) { logger.info("Could not shut down embedded database", ex); } - finally { - if (con != null) { - try { - con.close(); - } - catch (SQLException ex) { - logger.debug("Could not close JDBC Connection on shutdown", ex); - } - catch (Throwable ex) { - logger.debug("Unexpected exception on closing JDBC Connection", ex); - } - } - } } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java index 0fbfd7b824a3..c13db41a446b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/init/ScriptUtils.java @@ -253,8 +253,7 @@ public static void executeSqlScript(Connection connection, EncodedResource resou blockCommentEndDelimiter, statements); int stmtNumber = 0; - Statement stmt = connection.createStatement(); - try { + try (Statement stmt = connection.createStatement()) { for (String statement : statements) { stmtNumber++; try { @@ -270,27 +269,19 @@ public static void executeSqlScript(Connection connection, EncodedResource resou warningToLog = warningToLog.getNextWarning(); } } - } - catch (SQLException ex) { + } catch (SQLException ex) { boolean dropStatement = StringUtils.startsWithIgnoreCase(statement.trim(), "drop"); if (continueOnError || (dropStatement && ignoreFailedDrops)) { if (logger.isDebugEnabled()) { logger.debug(ScriptStatementFailedException.buildErrorMessage(statement, stmtNumber, resource), ex); } - } - else { + } else { throw new ScriptStatementFailedException(statement, stmtNumber, resource, ex); } } } - } - finally { - try { - stmt.close(); - } - catch (Throwable ex) { - logger.trace("Could not close JDBC Statement", ex); - } + } catch (Throwable ex) { + logger.trace("Could not close JDBC Statement", ex); } long elapsedTime = System.currentTimeMillis() - startTime; diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java index 9de98b612761..a8a8f724ec15 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java @@ -316,21 +316,19 @@ protected boolean doReceiveAndExecute(Object invoker, @Nullable Session session, boolean exposeResource = (!transactional && isExposeListenerSession() && !TransactionSynchronizationManager.hasResource(obtainConnectionFactory())); Observation observation = createObservation(message).start(); - Observation.Scope scope = observation.openScope(); - if (logger.isDebugEnabled()) { - logger.debug("Received message of type [" + message.getClass() + "] from consumer [" + - consumerToUse + "] of " + (transactional ? "transactional " : "") + "session [" + - sessionToUse + "]"); - } - try { + try (Observation.Scope ignored = observation.openScope()) { + if (logger.isDebugEnabled()) { + logger.debug("Received message of type [" + message.getClass() + "] from consumer [" + + consumerToUse + "] of " + (transactional ? "transactional " : "") + "session [" + + sessionToUse + "]"); + } messageReceived(invoker, sessionToUse); if (exposeResource) { TransactionSynchronizationManager.bindResource( obtainConnectionFactory(), new LocallyExposedJmsResourceHolder(sessionToUse)); } doExecuteListener(sessionToUse, message); - } - catch (Throwable ex) { + } catch (Throwable ex) { if (status != null) { if (logger.isDebugEnabled()) { logger.debug("Rolling back transaction because of listener exception thrown: " + ex); @@ -339,8 +337,7 @@ protected boolean doReceiveAndExecute(Object invoker, @Nullable Session session, } try { handleListenerException(ex); - } - catch (Throwable throwable) { + } catch (Throwable throwable) { observation.error(throwable); throw throwable; } @@ -349,13 +346,11 @@ protected boolean doReceiveAndExecute(Object invoker, @Nullable Session session, if (ex instanceof JMSException jmsException) { throw jmsException; } - } - finally { + } finally { if (exposeResource) { TransactionSynchronizationManager.unbindResource(obtainConnectionFactory()); } observation.stop(); - scope.close(); } // Indicate that a message has been received. return true; diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/hibernate/HibernateMultiEntityManagerFactoryIntegrationTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/hibernate/HibernateMultiEntityManagerFactoryIntegrationTests.java index 76b3b7f2e9d6..9c1022fe26ff 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/hibernate/HibernateMultiEntityManagerFactoryIntegrationTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/hibernate/HibernateMultiEntityManagerFactoryIntegrationTests.java @@ -58,14 +58,10 @@ protected void testEntityManagerFactoryImplementsEntityManagerFactoryInfo() { @Test void testEntityManagerFactory2() { - EntityManager em = this.entityManagerFactory2.createEntityManager(); - try { + try (EntityManager em = this.entityManagerFactory2.createEntityManager()) { assertThatIllegalArgumentException().isThrownBy(() -> em.createQuery("select tb from TestBean")); } - finally { - em.close(); - } } } diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java index 02bb193520e6..7771ff3c1261 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceHttpMessageConverter.java @@ -152,22 +152,16 @@ protected void writeContent(Resource resource, HttpOutputMessage outputMessage) // We cannot use try-with-resources here for the InputStream, since we have // custom handling of the close() method in a finally-block. try { - InputStream in = resource.getInputStream(); - try { - OutputStream out = outputMessage.getBody(); - in.transferTo(out); - out.flush(); - } - catch (NullPointerException ex) { - // ignore, see SPR-13620 - } - finally { + try (InputStream in = resource.getInputStream()) { try { - in.close(); - } - catch (Throwable ex) { - // ignore, see SPR-12999 + OutputStream out = outputMessage.getBody(); + in.transferTo(out); + out.flush(); + } catch (NullPointerException ex) { + // ignore, see SPR-13620 } + } catch (Throwable ex) { + // ignore, see SPR-12999 } } catch (FileNotFoundException ex) { diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java index 216fdc29361b..1d4fa45db02f 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java @@ -173,19 +173,11 @@ protected void writeResourceRegion(ResourceRegion region, HttpOutputMessage outp responseHeaders.add("Content-Range", "bytes " + start + '-' + end + '/' + resourceLength); responseHeaders.setContentLength(rangeLength); - InputStream in = region.getResource().getInputStream(); // We cannot use try-with-resources here for the InputStream, since we have // custom handling of the close() method in a finally-block. - try { + try (InputStream in = region.getResource().getInputStream()) { StreamUtils.copyRange(in, outputMessage.getBody(), start, end); - } - finally { - try { - in.close(); - } - catch (IOException ex) { - // ignore - } + } catch (IOException ignored) { } }