From 7dbb2cbba8a891f8b9e42875bae15cbe9e864def Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 25 Jul 2024 10:09:33 +0100 Subject: [PATCH] Enable compile linting and treat warnings as errors Closes gh-232 --- .../main/java/com/example/data/cassandra/Order.java | 6 +++--- .../com/example/data/mongodb/reactive/LineItem.java | 6 +++--- .../java/com/example/data/mongodb/reactive/Order.java | 6 +++--- .../main/java/com/example/data/mongodb/LineItem.java | 6 +++--- .../src/main/java/com/example/data/mongodb/Order.java | 6 +++--- .../src/main/java/com/example/spring/orm/CLR.java | 2 +- .../jetty/WebfluxJettyApplicationAotTests.java | 4 ++-- .../undertow/WebfluxUndertowApplicationAotTests.java | 2 +- .../main/java/com/example/websocket/jetty/CLR.java | 2 +- .../main/java/com/example/websocket/stomp/CLR.java | 2 +- .../src/main/java/com/example/websocket/CLR.java | 2 +- .../aot/gradle/AotSmokeTestPlugin.java | 11 +++++++++++ .../java/com/example/kafka/KafkaAvroApplication.java | 10 +++++----- .../security/method/SecurityConfiguration.java | 1 + ...Auth2AuthorizationServerSecurityConfiguration.java | 1 + .../example/security/webflux/WebSecurityConfig.java | 1 + .../example/security/webmvc/WebSecurityConfig.java | 1 + 17 files changed, 42 insertions(+), 27 deletions(-) diff --git a/data/data-cassandra/src/main/java/com/example/data/cassandra/Order.java b/data/data-cassandra/src/main/java/com/example/data/cassandra/Order.java index 8e6483d3..9d7344b5 100755 --- a/data/data-cassandra/src/main/java/com/example/data/cassandra/Order.java +++ b/data/data-cassandra/src/main/java/com/example/data/cassandra/Order.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.annotation.PersistenceCreator; import org.springframework.data.cassandra.core.cql.PrimaryKeyType; import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.Indexed; @@ -65,7 +65,7 @@ public class Order { this(customerId, null); } - @PersistenceConstructor + @PersistenceCreator public Order(String id, String customerId, Date orderDate, List items) { this.id = id; diff --git a/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/LineItem.java b/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/LineItem.java index 969e5dda..f5d1a4e9 100755 --- a/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/LineItem.java +++ b/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/LineItem.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package com.example.data.mongodb.reactive; -import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.annotation.PersistenceCreator; public class LineItem { @@ -31,7 +31,7 @@ public class LineItem { this.price = price; } - @PersistenceConstructor + @PersistenceCreator public LineItem(String caption, double price, int quantity) { this(caption, price); diff --git a/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/Order.java b/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/Order.java index 26600d7a..3bf0e7a4 100755 --- a/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/Order.java +++ b/data/data-mongodb-reactive/src/main/java/com/example/data/mongodb/reactive/Order.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.annotation.PersistenceCreator; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -61,7 +61,7 @@ public class Order { this(customerId, null); } - @PersistenceConstructor + @PersistenceCreator public Order(String id, String customerId, Date orderDate, List items) { this.id = id; diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/LineItem.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/LineItem.java index 5412f648..aa747ff6 100755 --- a/data/data-mongodb/src/main/java/com/example/data/mongodb/LineItem.java +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/LineItem.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package com.example.data.mongodb; -import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.annotation.PersistenceCreator; public class LineItem { @@ -31,7 +31,7 @@ public class LineItem { this.price = price; } - @PersistenceConstructor + @PersistenceCreator public LineItem(String caption, double price, int quantity) { this(caption, price); diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/Order.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/Order.java index be1d9a43..059c0501 100755 --- a/data/data-mongodb/src/main/java/com/example/data/mongodb/Order.java +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/Order.java @@ -1,5 +1,5 @@ /* - * Copyright 2022 the original author or authors. + * Copyright 2022-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.annotation.PersistenceCreator; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.index.Index; import org.springframework.data.mongodb.core.index.IndexDefinition; @@ -87,7 +87,7 @@ public class Order { this(customerId, null); } - @PersistenceConstructor + @PersistenceCreator public Order(String id, String customerId, Date orderDate, List items) { this.id = id; diff --git a/framework/hibernate/src/main/java/com/example/spring/orm/CLR.java b/framework/hibernate/src/main/java/com/example/spring/orm/CLR.java index 5d8e858b..2a1e93bf 100644 --- a/framework/hibernate/src/main/java/com/example/spring/orm/CLR.java +++ b/framework/hibernate/src/main/java/com/example/spring/orm/CLR.java @@ -28,7 +28,7 @@ public class CLR implements CommandLineRunner { public void entityGraph(Long id) { - EntityGraph entityGraph = entityManager.getEntityGraph("Book.authors"); + EntityGraph entityGraph = entityManager.getEntityGraph("Book.authors"); System.out.println("entityGraph: " + entityGraph); diff --git a/framework/webflux-jetty/src/appTest/java/com/example/webflux/jetty/WebfluxJettyApplicationAotTests.java b/framework/webflux-jetty/src/appTest/java/com/example/webflux/jetty/WebfluxJettyApplicationAotTests.java index 063b59e0..7d04d85b 100644 --- a/framework/webflux-jetty/src/appTest/java/com/example/webflux/jetty/WebfluxJettyApplicationAotTests.java +++ b/framework/webflux-jetty/src/appTest/java/com/example/webflux/jetty/WebfluxJettyApplicationAotTests.java @@ -109,13 +109,13 @@ class WebfluxJettyApplicationAotTests { @Test @Disabled("https://github.com/spring-projects/spring-boot/issues/33347") + @SuppressWarnings({ "deprecation", "removal" }) void websocket(@ApplicationUrl(scheme = Scheme.WEBSOCKET) URI applicationUrl) { JettyWebSocketClient client = new JettyWebSocketClient(); client.start(); try { // We can't use StepVerifier here, as it isn't designed to be used in a - // reactive - // pipeline + // reactive pipeline AtomicReference> messages = new AtomicReference<>(); client .execute(URI.create(applicationUrl.resolve("/ws/count").toString()), diff --git a/framework/webflux-undertow/src/appTest/java/com/example/webflux/undertow/WebfluxUndertowApplicationAotTests.java b/framework/webflux-undertow/src/appTest/java/com/example/webflux/undertow/WebfluxUndertowApplicationAotTests.java index fc3bf889..0ca09f5d 100644 --- a/framework/webflux-undertow/src/appTest/java/com/example/webflux/undertow/WebfluxUndertowApplicationAotTests.java +++ b/framework/webflux-undertow/src/appTest/java/com/example/webflux/undertow/WebfluxUndertowApplicationAotTests.java @@ -108,7 +108,7 @@ class WebfluxUndertowApplicationAotTests { } @Test - @Disabled("https://github.com/spring-projects/spring-boot/issues/33347") + @SuppressWarnings({ "deprecation", "removal" }) void websocket(@ApplicationUrl(scheme = Scheme.WEBSOCKET) URI applicationUrl) { JettyWebSocketClient client = new JettyWebSocketClient(); client.start(); diff --git a/framework/websocket-jetty/src/main/java/com/example/websocket/jetty/CLR.java b/framework/websocket-jetty/src/main/java/com/example/websocket/jetty/CLR.java index 57131322..a43cd7ba 100644 --- a/framework/websocket-jetty/src/main/java/com/example/websocket/jetty/CLR.java +++ b/framework/websocket-jetty/src/main/java/com/example/websocket/jetty/CLR.java @@ -26,7 +26,7 @@ class CLR implements CommandLineRunner { @Override public void run(String... args) throws Exception { WebSocketSession session = this.webSocketClient - .doHandshake(new MyWebsocketHandler(), null, + .execute(new MyWebsocketHandler(), null, URI.create("ws://localhost:%d/echo".formatted(getServerPort()))) .get(5, TimeUnit.SECONDS); TextMessage message = new TextMessage("Hello Websocket"); diff --git a/framework/websocket-stomp/src/main/java/com/example/websocket/stomp/CLR.java b/framework/websocket-stomp/src/main/java/com/example/websocket/stomp/CLR.java index a5d85ee6..9d1fe628 100644 --- a/framework/websocket-stomp/src/main/java/com/example/websocket/stomp/CLR.java +++ b/framework/websocket-stomp/src/main/java/com/example/websocket/stomp/CLR.java @@ -31,7 +31,7 @@ class CLR implements CommandLineRunner { public void run(String... args) throws Exception { MyStompHandler handler = new MyStompHandler(); StompSession stompSession = this.webSocketStompClient - .connect("ws://localhost:%d/stomp".formatted(getServerPort()), handler) + .connectAsync("ws://localhost:%d/stomp".formatted(getServerPort()), handler) .get(5, TimeUnit.SECONDS); stompSession.subscribe("/topic/greetings", handler); diff --git a/framework/websocket-tomcat/src/main/java/com/example/websocket/CLR.java b/framework/websocket-tomcat/src/main/java/com/example/websocket/CLR.java index 4e3bb76e..48b3a5d4 100644 --- a/framework/websocket-tomcat/src/main/java/com/example/websocket/CLR.java +++ b/framework/websocket-tomcat/src/main/java/com/example/websocket/CLR.java @@ -26,7 +26,7 @@ class CLR implements CommandLineRunner { @Override public void run(String... args) throws Exception { WebSocketSession session = this.webSocketClient - .doHandshake(new MyWebsocketHandler(), null, + .execute(new MyWebsocketHandler(), null, URI.create("ws://localhost:%d/echo".formatted(getServerPort()))) .get(5, TimeUnit.SECONDS); TextMessage message = new TextMessage("Hello Websocket"); diff --git a/gradle/plugins/aot-smoke-test-plugin/src/main/java/org/springframework/aot/gradle/AotSmokeTestPlugin.java b/gradle/plugins/aot-smoke-test-plugin/src/main/java/org/springframework/aot/gradle/AotSmokeTestPlugin.java index 67f7b3b1..b8254d49 100644 --- a/gradle/plugins/aot-smoke-test-plugin/src/main/java/org/springframework/aot/gradle/AotSmokeTestPlugin.java +++ b/gradle/plugins/aot-smoke-test-plugin/src/main/java/org/springframework/aot/gradle/AotSmokeTestPlugin.java @@ -46,6 +46,7 @@ import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.TaskProvider; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.testing.Test; import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile; @@ -86,6 +87,16 @@ public class AotSmokeTestPlugin implements Plugin { SourceSet appTest = javaExtension.getSourceSets().create("appTest"); javaExtension.setSourceCompatibility(JavaVersion.VERSION_17); javaExtension.setTargetCompatibility(JavaVersion.VERSION_17); + project.getTasks() + .withType(JavaCompile.class, + (javaCompile) -> javaCompile.getOptions() + .getCompilerArgs() + .addAll(List.of("-Werror", "-Xlint:unchecked", "-Xlint:deprecation", "-Xlint:rawtypes", + "-Xlint:varargs"))); + project.getDependencies() + .add(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME, "com.google.code.findbugs:jsr305:3.0.2"); + project.getDependencies() + .add(JavaPlugin.TEST_COMPILE_ONLY_CONFIGURATION_NAME, "com.google.code.findbugs:jsr305:3.0.2"); if (project.hasProperty("fromMavenLocal")) { String fromMavenLocal = project.property("fromMavenLocal").toString(); Stream includedGroups = Stream.of(fromMavenLocal.split(",")); diff --git a/integration/spring-kafka-avro/src/main/java/com/example/kafka/KafkaAvroApplication.java b/integration/spring-kafka-avro/src/main/java/com/example/kafka/KafkaAvroApplication.java index e34040df..037a72fb 100644 --- a/integration/spring-kafka-avro/src/main/java/com/example/kafka/KafkaAvroApplication.java +++ b/integration/spring-kafka-avro/src/main/java/com/example/kafka/KafkaAvroApplication.java @@ -51,7 +51,7 @@ public class KafkaAvroApplication { @Bean public ConcurrentMessageListenerContainer container3(NotAComponentMessageListener listener, - ConsumerFactory cf, ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { + ConsumerFactory cf, ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { ((DefaultKafkaConsumerFactory) cf).setValueDeserializer(new ThingAvroSerde()); ((DefaultKafkaProducerFactory) pf).setValueSerializer(new ThingAvroSerde()); @@ -63,8 +63,8 @@ public class KafkaAvroApplication { } @Bean - public ConcurrentMessageListenerContainer container6(BML6 listener, ConsumerFactory cf, - ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { + public ConcurrentMessageListenerContainer container6(BML6 listener, ConsumerFactory cf, + ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { factory.setCommonErrorHandler(new CommonContainerStoppingErrorHandler()); ConcurrentMessageListenerContainer container = factory.createContainer("graal6"); @@ -74,8 +74,8 @@ public class KafkaAvroApplication { } @Bean - public ConcurrentMessageListenerContainer container7(BML7 listener, ConsumerFactory cf, - ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { + public ConcurrentMessageListenerContainer container7(BML7 listener, ConsumerFactory cf, + ProducerFactory pf, ConcurrentKafkaListenerContainerFactory factory) { factory.setCommonErrorHandler(new CommonContainerStoppingErrorHandler()); ConcurrentMessageListenerContainer container = factory.createContainer("graal7"); diff --git a/security/security-method/src/main/java/com/example/security/method/SecurityConfiguration.java b/security/security-method/src/main/java/com/example/security/method/SecurityConfiguration.java index 4afae2c1..5b82b476 100644 --- a/security/security-method/src/main/java/com/example/security/method/SecurityConfiguration.java +++ b/security/security-method/src/main/java/com/example/security/method/SecurityConfiguration.java @@ -13,6 +13,7 @@ import org.springframework.security.provisioning.UserDetailsManager; class SecurityConfiguration { @Bean + @SuppressWarnings("deprecation") UserDetailsManager userDetailsManager() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") diff --git a/security/security-oauth2-authorization-server/src/main/java/com/example/security/oauth2authorizationserver/OAuth2AuthorizationServerSecurityConfiguration.java b/security/security-oauth2-authorization-server/src/main/java/com/example/security/oauth2authorizationserver/OAuth2AuthorizationServerSecurityConfiguration.java index 59d51784..b3a3e44f 100644 --- a/security/security-oauth2-authorization-server/src/main/java/com/example/security/oauth2authorizationserver/OAuth2AuthorizationServerSecurityConfiguration.java +++ b/security/security-oauth2-authorization-server/src/main/java/com/example/security/oauth2authorizationserver/OAuth2AuthorizationServerSecurityConfiguration.java @@ -136,6 +136,7 @@ public class OAuth2AuthorizationServerSecurityConfiguration { } @Bean + @SuppressWarnings("deprecation") public UserDetailsService userDetailsService() { // @formatter:off UserDetails userDetails = User.withDefaultPasswordEncoder() diff --git a/security/security-webflux/src/main/java/com/example/security/webflux/WebSecurityConfig.java b/security/security-webflux/src/main/java/com/example/security/webflux/WebSecurityConfig.java index 49b1d10a..da88a94d 100644 --- a/security/security-webflux/src/main/java/com/example/security/webflux/WebSecurityConfig.java +++ b/security/security-webflux/src/main/java/com/example/security/webflux/WebSecurityConfig.java @@ -29,6 +29,7 @@ public class WebSecurityConfig { } @Bean + @SuppressWarnings("deprecation") public ReactiveUserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") diff --git a/security/security-webmvc/src/main/java/com/example/security/webmvc/WebSecurityConfig.java b/security/security-webmvc/src/main/java/com/example/security/webmvc/WebSecurityConfig.java index 733d70f1..0619b2bb 100644 --- a/security/security-webmvc/src/main/java/com/example/security/webmvc/WebSecurityConfig.java +++ b/security/security-webmvc/src/main/java/com/example/security/webmvc/WebSecurityConfig.java @@ -29,6 +29,7 @@ public class WebSecurityConfig { } @Bean + @SuppressWarnings("deprecation") public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user")