From 455b79600a7f56ceed7fe2eba49a48525e3077cf Mon Sep 17 00:00:00 2001 From: rcalago <149600319+rcalago@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:18:45 +0800 Subject: [PATCH 01/16] Update README.md --- spring-kafka-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-kafka-3/README.md b/spring-kafka-3/README.md index 5250070952..82bd41dd69 100644 --- a/spring-kafka-3/README.md +++ b/spring-kafka-3/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Spring Kafka Trusted Packages Feature](https://www.baeldung.com/spring-kafka-trusted-packages-feature) - [How to Catch Deserialization Errors in Spring-Kafka?](https://www.baeldung.com/spring-kafka-deserialization-errors) +- [View Kafka Headers in Java](https://www.baeldung.com/java-kafka-view-headers) From cc43af9747f1220499708c73addcf7851c7c2db8 Mon Sep 17 00:00:00 2001 From: rcalago <149600319+rcalago@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:19:54 +0800 Subject: [PATCH 02/16] Update README.md --- persistence-modules/spring-boot-persistence-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-boot-persistence-3/README.md b/persistence-modules/spring-boot-persistence-3/README.md index 34bbe10dc3..fc1da55635 100644 --- a/persistence-modules/spring-boot-persistence-3/README.md +++ b/persistence-modules/spring-boot-persistence-3/README.md @@ -2,4 +2,5 @@ - [Patterns for Iterating Over Large Result Sets With Spring Data JPA](https://www.baeldung.com/spring-data-jpa-iterate-large-result-sets) - [Count the Number of Rows in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-row-count) - [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source) +- [How To Use findBy() With Multiple Columns in JPA](https://www.baeldung.com/spring-data-jpa-findby-multiple-columns) - More articles: [[<-- prev]](../spring-boot-persistence-2) From dc68d08adef7d68f4a90d1ac3b6b856abd1338a3 Mon Sep 17 00:00:00 2001 From: rcalago <149600319+rcalago@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:21:25 +0800 Subject: [PATCH 03/16] Update README.md --- spring-kafka-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-kafka-3/README.md b/spring-kafka-3/README.md index 82bd41dd69..2cbfeaccb0 100644 --- a/spring-kafka-3/README.md +++ b/spring-kafka-3/README.md @@ -2,3 +2,4 @@ - [Spring Kafka Trusted Packages Feature](https://www.baeldung.com/spring-kafka-trusted-packages-feature) - [How to Catch Deserialization Errors in Spring-Kafka?](https://www.baeldung.com/spring-kafka-deserialization-errors) - [View Kafka Headers in Java](https://www.baeldung.com/java-kafka-view-headers) +- [Understanding Kafka InstanceAlreadyExistsException in Java](https://www.baeldung.com/kafka-instancealreadyexistsexception) From c1e287b9c932ce8f7c1904c94bf08f40054f3927 Mon Sep 17 00:00:00 2001 From: Wynn Teo <49014791+wynnteo@users.noreply.github.com> Date: Sun, 25 Feb 2024 09:51:07 +0800 Subject: [PATCH 04/16] Bael 7394 (#15942) * BAEL-7490 read write file in separate thread * Change the to try resources * Update the code to sync with article * BAEL-7394 @datatestjpa in junit * Added new module to parent --- persistence-modules/pom.xml | 1 + .../spring-data-jpa-annotations-2/pom.xml | 34 ++++++++++ .../java/com/baeldung/datajpatest/User.java | 42 ++++++++++++ .../baeldung/datajpatest/UserApplication.java | 12 ++++ .../baeldung/datajpatest/UserRepository.java | 8 +++ .../UserRepositoryIntegrationTest.java | 68 +++++++++++++++++++ 6 files changed, 165 insertions(+) create mode 100644 persistence-modules/spring-data-jpa-annotations-2/pom.xml create mode 100644 persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/User.java create mode 100644 persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserApplication.java create mode 100644 persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserRepository.java create mode 100644 persistence-modules/spring-data-jpa-annotations-2/src/test/java/com/baeldung/datajpatest/UserRepositoryIntegrationTest.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index f059ec449a..e4363cce9c 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -80,6 +80,7 @@ spring-data-geode spring-data-jpa-annotations + spring-data-jpa-annotations-2 spring-data-jpa-crud spring-data-jpa-crud-2 spring-data-jpa-enterprise diff --git a/persistence-modules/spring-data-jpa-annotations-2/pom.xml b/persistence-modules/spring-data-jpa-annotations-2/pom.xml new file mode 100644 index 0000000000..306d2ed172 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations-2/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + spring-data-jpa-annotations-2 + spring-data-jpa-annotations-2 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + + + jakarta.persistence + jakarta.persistence-api + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/User.java b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/User.java new file mode 100644 index 0000000000..23b9273c82 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/User.java @@ -0,0 +1,42 @@ +package com.baeldung.datajpatest; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "app_user") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String username; + private String password; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserApplication.java b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserApplication.java new file mode 100644 index 0000000000..b58c7b2339 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.datajpatest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserApplication { + + public static void main(String[] args) { + SpringApplication.run(UserApplication.class); + } +} diff --git a/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserRepository.java b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserRepository.java new file mode 100644 index 0000000000..3393081203 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations-2/src/main/java/com/baeldung/datajpatest/UserRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.datajpatest; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + + User findByUsername(String username); +} \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-annotations-2/src/test/java/com/baeldung/datajpatest/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-annotations-2/src/test/java/com/baeldung/datajpatest/UserRepositoryIntegrationTest.java new file mode 100644 index 0000000000..9c933c8202 --- /dev/null +++ b/persistence-modules/spring-data-jpa-annotations-2/src/test/java/com/baeldung/datajpatest/UserRepositoryIntegrationTest.java @@ -0,0 +1,68 @@ +package com.baeldung.datajpatest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.After; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +@DataJpaTest +public class UserRepositoryIntegrationTest { + + @Autowired + private UserRepository userRepository; + + private User testUser; + + @BeforeEach + public void setUp() { + // Initialize test data before each test method test + testUser = new User(); + testUser.setUsername("testuser"); + testUser.setPassword("password"); + userRepository.save(testUser); + } + + @After + public void tearDown() { + // Release test data after each test method + userRepository.delete(testUser); + } + + @Test + void givenUser_whenSaved_thenCanBeFoundById() { + // Verify that the user has been saved successfully + User savedUser = userRepository.findById(testUser.getId()) + .orElse(null); + + assertNotNull(savedUser); + assertEquals(testUser.getUsername(), savedUser.getUsername()); + assertEquals(testUser.getPassword(), savedUser.getPassword()); + } + + @Test + void givenUser_whenUpdated_thenCanBeFoundByIdWithUpdatedData() { + testUser.setUsername("updatedUsername"); + userRepository.save(testUser); + + User updatedUser = userRepository.findById(testUser.getId()) + .orElse(null); + + assertNotNull(updatedUser); + assertEquals("updatedUsername", updatedUser.getUsername()); + } + + @Test + void givenUser_whenFindByUsernameCalled_thenUserIsFound() { + User foundUser = userRepository.findByUsername("testuser"); + + assertNotNull(foundUser); + assertEquals("testuser", foundUser.getUsername()); + } +} \ No newline at end of file From f617d7985d2a461daf0e4c2477a9ebbbea8bc9f2 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Sun, 28 Jan 2024 17:41:58 +0530 Subject: [PATCH 05/16] BAEL-7351 Demo code --- .../spring/kafka/groupId/KafkaConfig.java | 47 +++++++++++++++++++ .../kafka/groupId/KafkaErrorHandler.java | 37 +++++++++++++++ .../baeldung/spring/kafka/groupId/Main.java | 14 ++++++ .../spring/kafka/groupId/MyKafkaConsumer.java | 41 ++++++++++++++++ .../spring/kafka/groupId/MyKafkaProducer.java | 24 ++++++++++ .../spring/kafka/groupId/MainLiveTest.java | 44 +++++++++++++++++ 6 files changed, 207 insertions(+) create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java create mode 100644 spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java new file mode 100644 index 0000000000..b8d7c42ec9 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.kafka.groupId; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; +import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.listener.CommonErrorHandler; + +@EnableKafka +@Configuration +class KafkaConfig { + + @Bean + ConsumerFactory consumerFactory(@Value("${spring.kafka.bootstrap-servers:localhost:9092}") String bootstrapServers) { + Map props = new HashMap<>(); + props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + props.put(ConsumerConfig.GROUP_ID_CONFIG, "${kafka.consumer.groupId:test-consumer-group}"); + props.put(ConsumerConfig.CLIENT_ID_CONFIG, "rex"); + props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + return new DefaultKafkaConsumerFactory<>(props, new StringDeserializer(), new StringDeserializer()); + } + + @Bean + ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(ConsumerFactory consumerFactory, + CommonErrorHandler commonErrorHandler) { + var factory = new ConcurrentKafkaListenerContainerFactory(); + factory.setConsumerFactory(consumerFactory); + factory.setCommonErrorHandler(commonErrorHandler); + return factory; + } + + @Bean + CommonErrorHandler kafkaErrorHandler() { + return new KafkaErrorHandler(); + } + +} \ No newline at end of file diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java new file mode 100644 index 0000000000..a30254ea47 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.kafka.groupId; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.common.errors.RecordDeserializationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.listener.CommonErrorHandler; +import org.springframework.kafka.listener.MessageListenerContainer; +import org.springframework.lang.NonNull; + +class KafkaErrorHandler implements CommonErrorHandler { + + private static final Logger log = LoggerFactory.getLogger(KafkaErrorHandler.class); + + @Override + public void handleRecord(@NonNull Exception exception, @NonNull ConsumerRecord record, @NonNull Consumer consumer, + @NonNull MessageListenerContainer container) { + handle(exception, consumer); + } + + @Override + public void handleOtherException(@NonNull Exception exception, @NonNull Consumer consumer, @NonNull MessageListenerContainer container, + boolean batchListener) { + handle(exception, consumer); + } + + private void handle(Exception exception, Consumer consumer) { + log.error("Exception thrown", exception); + if (exception instanceof RecordDeserializationException ex) { + consumer.seek(ex.topicPartition(), ex.offset() + 1L); + consumer.commitSync(); + } else { + log.error("Exception not handled", exception); + } + } +} \ No newline at end of file diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java new file mode 100644 index 0000000000..1045bc5192 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.kafka.groupId; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java new file mode 100644 index 0000000000..e17d168338 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java @@ -0,0 +1,41 @@ +package com.baeldung.spring.kafka.groupId; + +import java.util.concurrent.CountDownLatch; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Service; + +@Service +public class MyKafkaConsumer { + + private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaConsumer.class); + + private CountDownLatch latch = new CountDownLatch(1); + + private String payload; + + @KafkaListener(topics = "${kafka.topic.name:test-topic}", groupId = "${kafka.consumer.groupId:test-consumer-group}", concurrency = "4") + public void receive(@Payload String payload, Consumer consumer) { + LOGGER.info("Consumer='{}' received payload='{}'", consumer.groupMetadata() + .memberId(), payload); + this.payload = payload; + + latch.countDown(); + } + + public CountDownLatch getLatch() { + return latch; + } + + public void resetLatch() { + latch = new CountDownLatch(1); + } + + public String getPayload() { + return payload; + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java new file mode 100644 index 0000000000..c1d9a05d60 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.kafka.groupId; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; + +@Service +public class MyKafkaProducer { + + private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaProducer.class); + + @Value("${kafka.topic.name:test-topic}") + private String topic; + @Autowired + private KafkaTemplate kafkaTemplate; + + public void send(String payload) { + LOGGER.info("Sending payload='{}' to topic='{}'", payload, topic); + kafkaTemplate.send(topic, payload); + } +} diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java new file mode 100644 index 0000000000..97b056db73 --- /dev/null +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -0,0 +1,44 @@ +package com.baeldung.spring.kafka.groupId; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.test.annotation.DirtiesContext; + +@SpringBootTest(classes = Main.class) +@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") +@DirtiesContext +@EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +public class MainLiveTest { + + @Autowired + private MyKafkaConsumer consumer; + @Autowired + private MyKafkaProducer producer; + + @BeforeEach + void setup() { + consumer.resetLatch(); + } + + @Test + public void givenEmbeddedKafkaBroker_whenSendingWithSimpleProducer_thenMessageReceived() throws Exception { + String data = "Test 123..."; + + producer.send(data); + + boolean messageConsumed = consumer.getLatch() + .await(10, TimeUnit.SECONDS); + assertTrue(messageConsumed); + assertThat(consumer.getPayload(), containsString(data)); + } +} \ No newline at end of file From ca9ebc37cfef17d3bd80c459610891ead94a71b1 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Sun, 28 Jan 2024 19:59:17 +0530 Subject: [PATCH 06/16] BAEL-7351 added new lines --- .../java/com/baeldung/spring/kafka/groupId/KafkaConfig.java | 2 +- .../com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java | 2 +- .../java/com/baeldung/spring/kafka/groupId/MainLiveTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java index b8d7c42ec9..6514816424 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java @@ -44,4 +44,4 @@ class KafkaConfig { return new KafkaErrorHandler(); } -} \ No newline at end of file +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java index a30254ea47..00cc795272 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java @@ -34,4 +34,4 @@ class KafkaErrorHandler implements CommonErrorHandler { log.error("Exception not handled", exception); } } -} \ No newline at end of file +} diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java index 97b056db73..c7e78f6e58 100644 --- a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -41,4 +41,4 @@ public class MainLiveTest { assertTrue(messageConsumed); assertThat(consumer.getPayload(), containsString(data)); } -} \ No newline at end of file +} From d8e035da08782a110ca8e75e7bdc96c90d4ae7fa Mon Sep 17 00:00:00 2001 From: s9m33r Date: Wed, 31 Jan 2024 00:40:41 +0530 Subject: [PATCH 07/16] BAEL-7351 moving to a new module --- apache-kafka-3/.gitignore | 33 +++++++ apache-kafka-3/pom.xml | 50 +++++++++++ .../apachekafka3}/groupId/KafkaConfig.java | 2 +- .../groupId/KafkaErrorHandler.java | 9 +- .../baeldung/apachekafka3}/groupId/Main.java | 28 +++--- .../groupId/MyKafkaConsumer.java | 82 ++++++++--------- .../groupId/MyKafkaProducer.java | 48 +++++----- .../src/main/resources/application.properties | 1 + .../apachekafka3}/groupId/MainLiveTest.java | 88 +++++++++---------- pom.xml | 3 +- 10 files changed, 211 insertions(+), 133 deletions(-) create mode 100644 apache-kafka-3/.gitignore create mode 100644 apache-kafka-3/pom.xml rename {spring-kafka-3/src/main/java/com/baeldung/spring/kafka => apache-kafka-3/src/main/java/com/baeldung/apachekafka3}/groupId/KafkaConfig.java (97%) rename {spring-kafka-3/src/main/java/com/baeldung/spring/kafka => apache-kafka-3/src/main/java/com/baeldung/apachekafka3}/groupId/KafkaErrorHandler.java (76%) rename {spring-kafka-3/src/main/java/com/baeldung/spring/kafka => apache-kafka-3/src/main/java/com/baeldung/apachekafka3}/groupId/Main.java (73%) rename {spring-kafka-3/src/main/java/com/baeldung/spring/kafka => apache-kafka-3/src/main/java/com/baeldung/apachekafka3}/groupId/MyKafkaConsumer.java (82%) rename {spring-kafka-3/src/main/java/com/baeldung/spring/kafka => apache-kafka-3/src/main/java/com/baeldung/apachekafka3}/groupId/MyKafkaProducer.java (91%) create mode 100644 apache-kafka-3/src/main/resources/application.properties rename {spring-kafka-3/src/test/java/com/baeldung/spring/kafka => apache-kafka-3/src/test/java/com/baeldung/apachekafka3}/groupId/MainLiveTest.java (90%) diff --git a/apache-kafka-3/.gitignore b/apache-kafka-3/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/apache-kafka-3/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/apache-kafka-3/pom.xml b/apache-kafka-3/pom.xml new file mode 100644 index 0000000000..9466068482 --- /dev/null +++ b/apache-kafka-3/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + apache-kafka-3 + Apache Kafka 3 + Third module for Apache Kafka related articles + + 17 + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.kafka + spring-kafka + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.kafka + spring-kafka-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java similarity index 97% rename from spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java rename to apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java index 6514816424..da9a41f425 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java +++ b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.kafka.groupId; +package com.baeldung.apachekafka3.groupId; import java.util.HashMap; import java.util.Map; diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java similarity index 76% rename from spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java rename to apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java index 00cc795272..3acd18a452 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java +++ b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java @@ -1,7 +1,6 @@ -package com.baeldung.spring.kafka.groupId; +package com.baeldung.apachekafka3.groupId; import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.common.errors.RecordDeserializationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,12 +12,6 @@ class KafkaErrorHandler implements CommonErrorHandler { private static final Logger log = LoggerFactory.getLogger(KafkaErrorHandler.class); - @Override - public void handleRecord(@NonNull Exception exception, @NonNull ConsumerRecord record, @NonNull Consumer consumer, - @NonNull MessageListenerContainer container) { - handle(exception, consumer); - } - @Override public void handleOtherException(@NonNull Exception exception, @NonNull Consumer consumer, @NonNull MessageListenerContainer container, boolean batchListener) { diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java similarity index 73% rename from spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java rename to apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java index 1045bc5192..e38699270f 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java +++ b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java @@ -1,14 +1,14 @@ -package com.baeldung.spring.kafka.groupId; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") -public class Main { - - public static void main(String[] args) { - SpringApplication.run(Main.class, args); - } -} +package com.baeldung.apachekafka3.groupId; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = "com.baeldung.apachekafka3.groupId") +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java similarity index 82% rename from spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java rename to apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java index e17d168338..e3c7220479 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java +++ b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java @@ -1,41 +1,41 @@ -package com.baeldung.spring.kafka.groupId; - -import java.util.concurrent.CountDownLatch; - -import org.apache.kafka.clients.consumer.Consumer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.stereotype.Service; - -@Service -public class MyKafkaConsumer { - - private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaConsumer.class); - - private CountDownLatch latch = new CountDownLatch(1); - - private String payload; - - @KafkaListener(topics = "${kafka.topic.name:test-topic}", groupId = "${kafka.consumer.groupId:test-consumer-group}", concurrency = "4") - public void receive(@Payload String payload, Consumer consumer) { - LOGGER.info("Consumer='{}' received payload='{}'", consumer.groupMetadata() - .memberId(), payload); - this.payload = payload; - - latch.countDown(); - } - - public CountDownLatch getLatch() { - return latch; - } - - public void resetLatch() { - latch = new CountDownLatch(1); - } - - public String getPayload() { - return payload; - } -} +package com.baeldung.apachekafka3.groupId; + +import java.util.concurrent.CountDownLatch; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Service; + +@Service +public class MyKafkaConsumer { + + private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaConsumer.class); + + private CountDownLatch latch = new CountDownLatch(1); + + private String payload; + + @KafkaListener(topics = "${kafka.topic.name:test-topic}", clientIdPrefix = "neo", groupId = "${kafka.consumer.groupId:test-consumer-group}", concurrency = "4") + public void receive(@Payload String payload, Consumer consumer) { + LOGGER.info("Consumer='{}' received payload='{}'", consumer.groupMetadata() + .memberId(), payload); + this.payload = payload; + + latch.countDown(); + } + + public CountDownLatch getLatch() { + return latch; + } + + public void resetLatch() { + latch = new CountDownLatch(1); + } + + public String getPayload() { + return payload; + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java similarity index 91% rename from spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java rename to apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java index c1d9a05d60..8707ce800d 100644 --- a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java +++ b/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java @@ -1,24 +1,24 @@ -package com.baeldung.spring.kafka.groupId; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.stereotype.Service; - -@Service -public class MyKafkaProducer { - - private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaProducer.class); - - @Value("${kafka.topic.name:test-topic}") - private String topic; - @Autowired - private KafkaTemplate kafkaTemplate; - - public void send(String payload) { - LOGGER.info("Sending payload='{}' to topic='{}'", payload, topic); - kafkaTemplate.send(topic, payload); - } -} +package com.baeldung.apachekafka3.groupId; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; + +@Service +public class MyKafkaProducer { + + private static final Logger LOGGER = LoggerFactory.getLogger(MyKafkaProducer.class); + + @Value("${kafka.topic.name:test-topic}") + private String topic; + @Autowired + private KafkaTemplate kafkaTemplate; + + public void send(String payload) { + LOGGER.info("Sending payload='{}' to topic='{}'", payload, topic); + kafkaTemplate.send(topic, payload); + } +} diff --git a/apache-kafka-3/src/main/resources/application.properties b/apache-kafka-3/src/main/resources/application.properties new file mode 100644 index 0000000000..0fce641151 --- /dev/null +++ b/apache-kafka-3/src/main/resources/application.properties @@ -0,0 +1 @@ +kafka.topic.name=test-topic diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java similarity index 90% rename from spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java rename to apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java index c7e78f6e58..e10e41838a 100644 --- a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java +++ b/apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java @@ -1,44 +1,44 @@ -package com.baeldung.spring.kafka.groupId; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.concurrent.TimeUnit; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.kafka.test.context.EmbeddedKafka; -import org.springframework.test.annotation.DirtiesContext; - -@SpringBootTest(classes = Main.class) -@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") -@DirtiesContext -@EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) -public class MainLiveTest { - - @Autowired - private MyKafkaConsumer consumer; - @Autowired - private MyKafkaProducer producer; - - @BeforeEach - void setup() { - consumer.resetLatch(); - } - - @Test - public void givenEmbeddedKafkaBroker_whenSendingWithSimpleProducer_thenMessageReceived() throws Exception { - String data = "Test 123..."; - - producer.send(data); - - boolean messageConsumed = consumer.getLatch() - .await(10, TimeUnit.SECONDS); - assertTrue(messageConsumed); - assertThat(consumer.getPayload(), containsString(data)); - } -} +package com.baeldung.apachekafka3.groupId; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.concurrent.TimeUnit; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.kafka.test.context.EmbeddedKafka; +import org.springframework.test.annotation.DirtiesContext; + +@SpringBootTest(classes = Main.class) +@ComponentScan(basePackages = "com.baeldung.apachekafka3.groupId") +@DirtiesContext +@EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +public class MainLiveTest { + + @Autowired + private MyKafkaConsumer consumer; + @Autowired + private MyKafkaProducer producer; + + @BeforeEach + void setup() { + consumer.resetLatch(); + } + + @Test + public void givenEmbeddedKafkaBroker_whenSendingWithSimpleProducer_thenMessageReceived() throws Exception { + String data = "Test 123..."; + + producer.send(data); + + boolean messageConsumed = consumer.getLatch() + .await(10, TimeUnit.SECONDS); + assertTrue(messageConsumed); + assertThat(consumer.getPayload(), containsString(data)); + } +} diff --git a/pom.xml b/pom.xml index 030b8e1843..3a3ba46d48 100644 --- a/pom.xml +++ b/pom.xml @@ -670,8 +670,9 @@ apache-httpclient-2 apache-httpclient4 apache-httpclient - apache-kafka-2 apache-kafka + apache-kafka-2 + apache-kafka-3 apache-libraries-2 apache-libraries apache-olingo From a516aca5c49b594f3d3c4303119a4f2eb8206795 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Wed, 31 Jan 2024 21:52:54 +0530 Subject: [PATCH 08/16] BAEL-7351 moving demo code to a spring-kafka-2 module --- apache-kafka-3/.gitignore | 33 ------------ apache-kafka-3/pom.xml | 50 ------------------- .../src/main/resources/application.properties | 1 - pom.xml | 1 - .../spring/kafka}/groupId/KafkaConfig.java | 2 +- .../kafka}/groupId/KafkaErrorHandler.java | 2 +- .../baeldung/spring/kafka}/groupId/Main.java | 4 +- .../kafka}/groupId/MyKafkaConsumer.java | 2 +- .../kafka}/groupId/MyKafkaProducer.java | 2 +- .../spring/kafka}/groupId/MainLiveTest.java | 4 +- 10 files changed, 8 insertions(+), 93 deletions(-) delete mode 100644 apache-kafka-3/.gitignore delete mode 100644 apache-kafka-3/pom.xml delete mode 100644 apache-kafka-3/src/main/resources/application.properties rename {apache-kafka-3/src/main/java/com/baeldung/apachekafka3 => spring-kafka-2/src/main/java/com/baeldung/spring/kafka}/groupId/KafkaConfig.java (97%) rename {apache-kafka-3/src/main/java/com/baeldung/apachekafka3 => spring-kafka-2/src/main/java/com/baeldung/spring/kafka}/groupId/KafkaErrorHandler.java (96%) rename {apache-kafka-3/src/main/java/com/baeldung/apachekafka3 => spring-kafka-2/src/main/java/com/baeldung/spring/kafka}/groupId/Main.java (75%) rename {apache-kafka-3/src/main/java/com/baeldung/apachekafka3 => spring-kafka-2/src/main/java/com/baeldung/spring/kafka}/groupId/MyKafkaConsumer.java (96%) rename {apache-kafka-3/src/main/java/com/baeldung/apachekafka3 => spring-kafka-2/src/main/java/com/baeldung/spring/kafka}/groupId/MyKafkaProducer.java (94%) rename {apache-kafka-3/src/test/java/com/baeldung/apachekafka3 => spring-kafka-2/src/test/java/com/baeldung/spring/kafka}/groupId/MainLiveTest.java (92%) diff --git a/apache-kafka-3/.gitignore b/apache-kafka-3/.gitignore deleted file mode 100644 index 549e00a2a9..0000000000 --- a/apache-kafka-3/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/apache-kafka-3/pom.xml b/apache-kafka-3/pom.xml deleted file mode 100644 index 9466068482..0000000000 --- a/apache-kafka-3/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - 4.0.0 - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - apache-kafka-3 - Apache Kafka 3 - Third module for Apache Kafka related articles - - 17 - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.kafka - spring-kafka - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.kafka - spring-kafka-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/apache-kafka-3/src/main/resources/application.properties b/apache-kafka-3/src/main/resources/application.properties deleted file mode 100644 index 0fce641151..0000000000 --- a/apache-kafka-3/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -kafka.topic.name=test-topic diff --git a/pom.xml b/pom.xml index 3a3ba46d48..330035020f 100644 --- a/pom.xml +++ b/pom.xml @@ -672,7 +672,6 @@ apache-httpclient apache-kafka apache-kafka-2 - apache-kafka-3 apache-libraries-2 apache-libraries apache-olingo diff --git a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java similarity index 97% rename from apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java index da9a41f425..6514816424 100644 --- a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaConfig.java +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import java.util.HashMap; import java.util.Map; diff --git a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java similarity index 96% rename from apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java index 3acd18a452..c334925141 100644 --- a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/KafkaErrorHandler.java +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java @@ -1,4 +1,4 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.common.errors.RecordDeserializationException; diff --git a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/Main.java similarity index 75% rename from apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/Main.java index e38699270f..589b20c68f 100644 --- a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/Main.java +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/Main.java @@ -1,11 +1,11 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication -@ComponentScan(basePackages = "com.baeldung.apachekafka3.groupId") +@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") public class Main { public static void main(String[] args) { diff --git a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java similarity index 96% rename from apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java index e3c7220479..f26b605a7b 100644 --- a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaConsumer.java +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java @@ -1,4 +1,4 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import java.util.concurrent.CountDownLatch; diff --git a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java similarity index 94% rename from apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java rename to spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java index 8707ce800d..f8642a99a5 100644 --- a/apache-kafka-3/src/main/java/com/baeldung/apachekafka3/groupId/MyKafkaProducer.java +++ b/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java @@ -1,4 +1,4 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java similarity index 92% rename from apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java rename to spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java index e10e41838a..fb767f1f10 100644 --- a/apache-kafka-3/src/test/java/com/baeldung/apachekafka3/groupId/MainLiveTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.apachekafka3.groupId; +package com.baeldung.spring.kafka.groupId; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -15,7 +15,7 @@ import org.springframework.kafka.test.context.EmbeddedKafka; import org.springframework.test.annotation.DirtiesContext; @SpringBootTest(classes = Main.class) -@ComponentScan(basePackages = "com.baeldung.apachekafka3.groupId") +@ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") @DirtiesContext @EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) public class MainLiveTest { From e7be980d347458d2a13c98fc999eeccac73359ce Mon Sep 17 00:00:00 2001 From: s9m33r Date: Fri, 2 Feb 2024 01:23:09 +0530 Subject: [PATCH 09/16] BAEL-7351 running Embedded Kafka on a separate port for groupId tests --- .../java/com/baeldung/spring/kafka/groupId/MainLiveTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java index fb767f1f10..dad1dbbf5d 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -17,7 +17,7 @@ import org.springframework.test.annotation.DirtiesContext; @SpringBootTest(classes = Main.class) @ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") @DirtiesContext -@EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:9092", "port=9092" }) +@EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:8000", "port=8000" }) public class MainLiveTest { @Autowired From 95379f73cc089105c9e097986a1af4c52c1d75d3 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Sun, 4 Feb 2024 11:38:52 +0530 Subject: [PATCH 10/16] BAEL-7351 removed new lines --- .../java/com/baeldung/spring/kafka/groupId/MainLiveTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java index dad1dbbf5d..338ed2855f 100644 --- a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java +++ b/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -33,9 +33,7 @@ public class MainLiveTest { @Test public void givenEmbeddedKafkaBroker_whenSendingWithSimpleProducer_thenMessageReceived() throws Exception { String data = "Test 123..."; - producer.send(data); - boolean messageConsumed = consumer.getLatch() .await(10, TimeUnit.SECONDS); assertTrue(messageConsumed); From 45a8c4d66f95b1c303a83b8030d7d27d22a4d680 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Sun, 25 Feb 2024 14:55:06 +0530 Subject: [PATCH 11/16] revert unnecessary module re-ordering --- pom.xml | 2 +- .../java/com/baeldung/spring/kafka/groupId/KafkaConfig.java | 0 .../com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java | 0 .../src/main/java/com/baeldung/spring/kafka/groupId/Main.java | 0 .../java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java | 0 .../java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java | 0 .../java/com/baeldung/spring/kafka/groupId/MainLiveTest.java | 0 7 files changed, 1 insertion(+), 1 deletion(-) rename {spring-kafka-2 => spring-kafka-3}/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java (100%) rename {spring-kafka-2 => spring-kafka-3}/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java (100%) rename {spring-kafka-2 => spring-kafka-3}/src/main/java/com/baeldung/spring/kafka/groupId/Main.java (100%) rename {spring-kafka-2 => spring-kafka-3}/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java (100%) rename {spring-kafka-2 => spring-kafka-3}/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java (100%) rename {spring-kafka-2 => spring-kafka-3}/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java (100%) diff --git a/pom.xml b/pom.xml index 330035020f..030b8e1843 100644 --- a/pom.xml +++ b/pom.xml @@ -670,8 +670,8 @@ apache-httpclient-2 apache-httpclient4 apache-httpclient - apache-kafka apache-kafka-2 + apache-kafka apache-libraries-2 apache-libraries apache-olingo diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java similarity index 100% rename from spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java rename to spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaConfig.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java similarity index 100% rename from spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java rename to spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/KafkaErrorHandler.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/Main.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java similarity index 100% rename from spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/Main.java rename to spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/Main.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java similarity index 100% rename from spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java rename to spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaConsumer.java diff --git a/spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java similarity index 100% rename from spring-kafka-2/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java rename to spring-kafka-3/src/main/java/com/baeldung/spring/kafka/groupId/MyKafkaProducer.java diff --git a/spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java similarity index 100% rename from spring-kafka-2/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java rename to spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java From 7ade810d7697a53d9602f1b58dd06d0ae92f0fd0 Mon Sep 17 00:00:00 2001 From: s9m33r Date: Sun, 25 Feb 2024 15:27:47 +0530 Subject: [PATCH 12/16] BAEL-7351 test configuration --- .../java/com/baeldung/spring/kafka/groupId/MainLiveTest.java | 2 ++ .../src/test/resources/application-groupId.properties | 1 + 2 files changed, 3 insertions(+) create mode 100644 spring-kafka-3/src/test/resources/application-groupId.properties diff --git a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java index 338ed2855f..2c48d25ca2 100644 --- a/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java +++ b/spring-kafka-3/src/test/java/com/baeldung/spring/kafka/groupId/MainLiveTest.java @@ -13,8 +13,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.kafka.test.context.EmbeddedKafka; import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; @SpringBootTest(classes = Main.class) +@ActiveProfiles("groupId") @ComponentScan(basePackages = "com.baeldung.spring.kafka.groupId") @DirtiesContext @EmbeddedKafka(partitions = 4, topics = { "${kafka.topic.name:test-topic}" }, brokerProperties = { "listeners=PLAINTEXT://localhost:8000", "port=8000" }) diff --git a/spring-kafka-3/src/test/resources/application-groupId.properties b/spring-kafka-3/src/test/resources/application-groupId.properties new file mode 100644 index 0000000000..648ae1b603 --- /dev/null +++ b/spring-kafka-3/src/test/resources/application-groupId.properties @@ -0,0 +1 @@ +spring.kafka.bootstrap-servers=localhost:8000 From 7b7d7756db6c5efa6ab22403dc7513ff726336ed Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sun, 25 Feb 2024 17:31:03 +0530 Subject: [PATCH 13/16] JAVA-31207 Upgrade spring-cloud-modules/spring-cloud-gateway module to spring-boot-3 (#15915) --- .../spring-cloud-gateway/pom.xml | 24 ++++++++----------- .../GoldenCustomerRoutePredicateFactory.java | 2 +- .../oauth/backend/web/QuoteApi.java | 2 +- .../gatewayapp/CustomFiltersLiveTest.java | 2 +- .../ScrubResponseGatewayFilterLiveTest.java | 2 +- .../CustomPredicatesApplicationLiveTest.java | 2 +- .../URLRewriteGatewayApplicationLiveTest.java | 2 +- .../RedisWebFilterFactoriesLiveTest.java | 7 +++--- .../WebFilterFactoriesLiveTest.java | 2 +- 9 files changed, 20 insertions(+), 25 deletions(-) diff --git a/spring-cloud-modules/spring-cloud-gateway/pom.xml b/spring-cloud-modules/spring-cloud-gateway/pom.xml index 0287ab7588..5d0594a259 100644 --- a/spring-cloud-modules/spring-cloud-gateway/pom.xml +++ b/spring-cloud-modules/spring-cloud-gateway/pom.xml @@ -8,9 +8,10 @@ jar - com.baeldung.spring.cloud - spring-cloud-modules - 1.0.0-SNAPSHOT + com.baeldung + parent-boot-3 + 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -29,13 +30,6 @@ pom import - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - @@ -67,8 +61,9 @@ ${hibernate-validator.version} - javax.validation - validation-api + jakarta.validation + jakarta.validation-api + ${jakarta.validation-api.version} org.springframework.boot @@ -109,6 +104,7 @@ org.springframework.boot spring-boot-maven-plugin + com.baeldung.springcloudgateway.introduction.IntroductionGatewayApplication org.projectlombok @@ -183,12 +179,12 @@ - - + 2023.0.0 8.0.1.Final 0.7.2 9.19 + 3.0.2 \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/custompredicates/factories/GoldenCustomerRoutePredicateFactory.java b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/custompredicates/factories/GoldenCustomerRoutePredicateFactory.java index cb5c3a0b50..cf4545fd50 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/custompredicates/factories/GoldenCustomerRoutePredicateFactory.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/custompredicates/factories/GoldenCustomerRoutePredicateFactory.java @@ -7,7 +7,7 @@ import java.util.Arrays; import java.util.List; import java.util.function.Predicate; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotEmpty; import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.http.HttpCookie; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java index 6d3721166c..cf81b4a99e 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java @@ -1,6 +1,6 @@ package com.baeldung.springcloudgateway.oauth.backend.web; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java index f49f8c68b6..a34f152a86 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ScrubResponseGatewayFilterLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ScrubResponseGatewayFilterLiveTest.java index 8906af774e..e43d017267 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ScrubResponseGatewayFilterLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ScrubResponseGatewayFilterLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.cloud.gateway.filter.factory.SetPathGatewayFilterFactory; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/custompredicates/CustomPredicatesApplicationLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/custompredicates/CustomPredicatesApplicationLiveTest.java index d9988ceb5e..08082f7c15 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/custompredicates/CustomPredicatesApplicationLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/custompredicates/CustomPredicatesApplicationLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/rewrite/URLRewriteGatewayApplicationLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/rewrite/URLRewriteGatewayApplicationLiveTest.java index 41fe37045c..fe9d20024b 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/rewrite/URLRewriteGatewayApplicationLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/rewrite/URLRewriteGatewayApplicationLiveTest.java @@ -13,7 +13,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java index a28eb68775..cf6302eb28 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/RedisWebFilterFactoriesLiveTest.java @@ -11,7 +11,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; @@ -51,9 +51,8 @@ public class RedisWebFilterFactoriesLiveTest { ResponseEntity r = restTemplate.getForEntity(url, String.class); // assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - LOGGER.info("Received: status->{}, reason->{}, remaining->{}", - r.getStatusCodeValue(), r.getStatusCode().getReasonPhrase(), - r.getHeaders().get("X-RateLimit-Remaining")); + LOGGER.info("Received: status->{}, remaining->{}", + r.getStatusCodeValue(), r.getHeaders().get("X-RateLimit-Remaining")); } @After diff --git a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java index 67e00a42fc..0caf92c2e8 100644 --- a/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java +++ b/spring-cloud-modules/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/webfilters/WebFilterFactoriesLiveTest.java @@ -14,7 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; From cb3b854caa2cfbb31ccfc64cb4ea141aea652e99 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Sun, 25 Feb 2024 23:26:52 +0200 Subject: [PATCH 14/16] [JAVA-30180] Upgraded jackson library in main pom.xml (#15847) * [JAVA-30180] Upgraded jackson library in main pom.xml * [JAVA-30180] Reverted jackson upgrade for apache-kafka * [JAVA-30180] --- core-java-modules/core-java-11-3/pom.xml | 1 - core-java-modules/core-java-collections-list-5/pom.xml | 1 - jackson-modules/jackson-polymorphic-deserialization/pom.xml | 1 - jackson-simple/pom.xml | 6 +----- persistence-modules/spring-boot-persistence-4/pom.xml | 2 -- persistence-modules/spring-data-elasticsearch/pom.xml | 1 - pom.xml | 2 +- testing-modules/instancio/pom.xml | 1 - testing-modules/mocks-2/pom.xml | 1 - 9 files changed, 2 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-11-3/pom.xml b/core-java-modules/core-java-11-3/pom.xml index cacbc9089c..9d21958cff 100644 --- a/core-java-modules/core-java-11-3/pom.xml +++ b/core-java-modules/core-java-11-3/pom.xml @@ -45,7 +45,6 @@ 11 11 - 2.16.0 2.10.1 diff --git a/core-java-modules/core-java-collections-list-5/pom.xml b/core-java-modules/core-java-collections-list-5/pom.xml index d62263eb63..8fc5062ac0 100644 --- a/core-java-modules/core-java-collections-list-5/pom.xml +++ b/core-java-modules/core-java-collections-list-5/pom.xml @@ -60,7 +60,6 @@ 1.21 2.10.1 - 2.16.0 20230618 \ No newline at end of file diff --git a/jackson-modules/jackson-polymorphic-deserialization/pom.xml b/jackson-modules/jackson-polymorphic-deserialization/pom.xml index cbf67e5013..f25268d6f8 100644 --- a/jackson-modules/jackson-polymorphic-deserialization/pom.xml +++ b/jackson-modules/jackson-polymorphic-deserialization/pom.xml @@ -36,7 +36,6 @@ - 2.16.0 0.9.11 diff --git a/jackson-simple/pom.xml b/jackson-simple/pom.xml index 900c80a5e7..08395c85a4 100644 --- a/jackson-simple/pom.xml +++ b/jackson-simple/pom.xml @@ -30,9 +30,5 @@ - - - 2.16.0 - - + \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-4/pom.xml b/persistence-modules/spring-boot-persistence-4/pom.xml index acff937114..2521590f3c 100644 --- a/persistence-modules/spring-boot-persistence-4/pom.xml +++ b/persistence-modules/spring-boot-persistence-4/pom.xml @@ -55,7 +55,6 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} org.modelmapper @@ -91,7 +90,6 @@ 17 1.0.7 3.7.0 - 2.16.0 3.2.0 1.16.1 1.18.30 diff --git a/persistence-modules/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml index b8edae68d3..1eb627ce57 100644 --- a/persistence-modules/spring-data-elasticsearch/pom.xml +++ b/persistence-modules/spring-data-elasticsearch/pom.xml @@ -60,7 +60,6 @@ 5.1.2 8.9.0 - 2.16.0 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 030b8e1843..a8e731c795 100644 --- a/pom.xml +++ b/pom.xml @@ -1192,7 +1192,7 @@ 1.2 2.3.3 1.2 - 2.16.0 + 2.16.1 1.5 1.9.2 5.9.2 diff --git a/testing-modules/instancio/pom.xml b/testing-modules/instancio/pom.xml index 7687ce282d..2cc1a84748 100644 --- a/testing-modules/instancio/pom.xml +++ b/testing-modules/instancio/pom.xml @@ -52,7 +52,6 @@ 2.9.0 - 2.14.1 5.9.2 diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml index 2ef1a03dff..9db598421e 100644 --- a/testing-modules/mocks-2/pom.xml +++ b/testing-modules/mocks-2/pom.xml @@ -33,7 +33,6 @@ 1.6.0 - 2.16.0 5.3.25 From 40952ba2cc634c992635c5dc67c1edd822e05a56 Mon Sep 17 00:00:00 2001 From: Oscar Mauricio Forero Carrillo Date: Sun, 25 Feb 2024 22:43:19 +0100 Subject: [PATCH 15/16] BAEL-7136: Remove spring-testing dependency on the parent POM and fix the dependencies to fix the integration tests (#15940) --- testing-modules/spring-testing/pom.xml | 94 +++++++++++++++---- .../java/com/baeldung/config/WebConfig.java | 2 +- .../src/test/resources/logback-spring.xml | 19 ++++ 3 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 testing-modules/spring-testing/src/test/resources/logback-spring.xml diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index c4c929b7aa..665ac305a0 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/pom.xml @@ -3,18 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + com.baeldung spring-testing 0.1-SNAPSHOT spring-testing - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - - + + ch.qos.logback + logback-classic + 1.5.0 + test + org.hamcrest java-hamcrest @@ -23,29 +23,66 @@ org.projectlombok lombok - ${lombok.version} + 1.18.30 provided org.springframework.boot spring-boot-starter + 3.2.2 + + + org.springframework.boot + spring-boot-starter-logging + + - org.springframework.boot - spring-boot-starter-test - test + spring-boot + 3.2.2 + + + org.springframework.data + spring-data-jpa + 3.2.2 + + + org.springframework.data + spring-data-commons + 3.2.2 + + + org.springframework + spring-beans + ${spring.version} org.springframework spring-core ${spring.version} + compile org.springframework spring-context ${spring.version} + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + org.springframework spring-webmvc @@ -56,10 +93,6 @@ javax.persistence ${javax.persistence.version} - - org.springframework.data - spring-data-jpa - org.awaitility awaitility @@ -67,9 +100,34 @@ test - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} + jakarta.servlet + jakarta.servlet-api + 6.0.0 + + + + org.springframework.boot + spring-boot-starter-test + test + 3.2.2 + + + org.springframework.boot + spring-boot-starter-logging + + + + + org.junit.jupiter + junit-jupiter + 5.9.2 + test + + + org.junit.vintage + junit-vintage-engine + 5.9.2 + test diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java b/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java index eca0aed57f..3ccd8b94da 100644 --- a/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java @@ -5,7 +5,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; @EnableWebMvc @Configuration diff --git a/testing-modules/spring-testing/src/test/resources/logback-spring.xml b/testing-modules/spring-testing/src/test/resources/logback-spring.xml new file mode 100644 index 0000000000..6636929220 --- /dev/null +++ b/testing-modules/spring-testing/src/test/resources/logback-spring.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From a3d63f75f60b2c1d888908651b56af619a8e0178 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Mon, 26 Feb 2024 03:16:11 +0530 Subject: [PATCH 16/16] Java 29291 :- Upgrade Spring Security LDAP to Spring Boot 3 (#15901) * JAVA-29291 :- Upgrade to Boot 3 * JAVA-29291 :- Upgrade to Boot 3 * JAVA-29291 :- Upgrade to Boot 3 * JAVA-29291 :- Upgrade to Boot 3 --- .../spring-security-ldap/pom.xml | 10 +- .../com/baeldung/SampleLDAPApplication.java | 3 - .../com/baeldung/config/SecurityConfig.java | 27 ++- .../server/core/avltree/ArrayMarshaller.java | 172 ++++++++++++++++++ 4 files changed, 192 insertions(+), 20 deletions(-) create mode 100644 spring-security-modules/spring-security-ldap/src/main/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java diff --git a/spring-security-modules/spring-security-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml index 9f4f3b4106..0da7fc27c5 100644 --- a/spring-security-modules/spring-security-ldap/pom.xml +++ b/spring-security-modules/spring-security-ldap/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-security-modules + parent-boot-3 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -64,6 +65,11 @@ + + com.unboundid + unboundid-ldapsdk + ${unboundid-ldapsdk.version} + @@ -78,6 +84,8 @@ 1.5.5 + com.baeldung.SampleLDAPApplication + 4.0.10 \ No newline at end of file diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java index 2d619cccfa..af1dd350a8 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/SampleLDAPApplication.java @@ -3,9 +3,6 @@ package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Main Application Class - uses Spring Boot. Just run this as a normal Java diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java index 78e4dff29c..b76b1d945b 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java @@ -6,7 +6,7 @@ import org.springframework.ldap.core.support.BaseLdapPathContextSource; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.ldap.LdapBindAuthenticationManagerFactory; -import org.springframework.security.ldap.server.ApacheDSContainer; +import org.springframework.security.ldap.server.UnboundIdContainer; import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator; import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; import org.springframework.security.web.SecurityFilterChain; @@ -19,8 +19,8 @@ import org.springframework.security.web.SecurityFilterChain; public class SecurityConfig { @Bean - ApacheDSContainer ldapContainer() throws Exception { - return new ApacheDSContainer("dc=baeldung,dc=com", "classpath:users.ldif"); + UnboundIdContainer ldapContainer() throws Exception { + return new UnboundIdContainer("dc=baeldung,dc=com", "classpath:users.ldif"); } @Bean @@ -41,18 +41,13 @@ public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests() - .antMatchers("/", "/home", "/css/**") - .permitAll() - .anyRequest() - .authenticated() - .and() - .formLogin() - .loginPage("/login") - .permitAll() - .and() - .logout() - .logoutSuccessUrl("/"); - return http.build(); + return http.authorizeHttpRequests(auth -> auth + .requestMatchers("/", "/home", "/css/**") + .permitAll() + .anyRequest() + .authenticated()) + .formLogin(httpSecurityFormLoginConfigurer -> + httpSecurityFormLoginConfigurer.loginPage("/login").permitAll()) + .logout(logout -> logout.logoutSuccessUrl("/")).build(); } } diff --git a/spring-security-modules/spring-security-ldap/src/main/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java b/spring-security-modules/spring-security-ldap/src/main/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java new file mode 100644 index 0000000000..78c1e69ee7 --- /dev/null +++ b/spring-security-modules/spring-security-ldap/src/main/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java @@ -0,0 +1,172 @@ +/* + * Copyright 2002-2021 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.directory.server.core.avltree; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Comparator; +import org.apache.directory.shared.ldap.util.StringTools; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Class to serialize the Array data. + * + * @author Apache Directory Project + * @version $Rev$, $Date$ + */ +@SuppressWarnings("unchecked") +public class ArrayMarshaller implements Marshaller> { + + /** static logger */ + private static final Logger LOG = LoggerFactory.getLogger(ArrayMarshaller.class); + + /** used for serialized form of an empty AvlTree */ + private static final byte[] EMPTY_TREE = new byte[1]; + + /** marshaller to be used for marshalling the keys */ + private Marshaller keyMarshaller; + + /** key Comparator for the AvlTree */ + private Comparator comparator; + + /** + * Creates a new instance of AvlTreeMarshaller with a custom key Marshaller. + * @param comparator Comparator to be used for key comparision + * @param keyMarshaller marshaller for keys + */ + public ArrayMarshaller(Comparator comparator, Marshaller keyMarshaller) { + this.comparator = comparator; + this.keyMarshaller = keyMarshaller; + } + + /** + * Creates a new instance of AvlTreeMarshaller with the default key Marshaller which + * uses Java Serialization. + * @param comparator Comparator to be used for key comparision + */ + public ArrayMarshaller(Comparator comparator) { + this.comparator = comparator; + this.keyMarshaller = (Marshaller) DefaultMarshaller.INSTANCE; + } + + /** + * Marshals the given tree to bytes + * @param tree the tree to be marshalled + */ + public byte[] serialize(ArrayTree tree) { + if ((tree == null) || (tree.size() == 0)) { + return EMPTY_TREE; + } + + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteStream); + byte[] data = null; + + try { + out.writeByte(0); // represents the start of an Array byte stream + out.writeInt(tree.size()); + + for (int position = 0; position < tree.size(); position++) { + E value = tree.get(position); + byte[] bytes = this.keyMarshaller.serialize(value); + + // Write the key length + out.writeInt(bytes.length); + + // Write the key if its length is not null + if (bytes.length != 0) { + out.write(bytes); + } + } + + out.flush(); + data = byteStream.toByteArray(); + + // Try to deserialize, just to see + try { + deserialize(data); + } + catch (NullPointerException npe) { + System.out.println("Bad serialization, tree : [" + StringTools.dumpBytes(data) + "]"); + throw npe; + } + + out.close(); + } + catch (IOException ex) { + ex.printStackTrace(); + } + + return data; + } + + /** + * Creates an Array from given bytes of data. + * @param data byte array to be converted into an array + */ + public ArrayTree deserialize(byte[] data) throws IOException { + try { + if ((data == null) || (data.length == 0)) { + throw new IOException("Null or empty data array is invalid."); + } + + if ((data.length == 1) && (data[0] == 0)) { + E[] array = (E[]) new Object[] {}; + ArrayTree tree = new ArrayTree(this.comparator, array); + return tree; + } + + ByteArrayInputStream bin = new ByteArrayInputStream(data); + DataInputStream din = new DataInputStream(bin); + + byte startByte = din.readByte(); + + if (startByte != 0) { + throw new IOException("wrong array serialized data format"); + } + + int size = din.readInt(); + E[] nodes = (E[]) new Object[size]; + + for (int i = 0; i < size; i++) { + // Read the object's size + int dataSize = din.readInt(); + + if (dataSize != 0) { + byte[] bytes = new byte[dataSize]; + + din.read(bytes); + E key = this.keyMarshaller.deserialize(bytes); + nodes[i] = key; + } + } + + ArrayTree arrayTree = new ArrayTree(this.comparator, nodes); + + return arrayTree; + } + catch (NullPointerException npe) { + System.out.println("Bad tree : [" + StringTools.dumpBytes(data) + "]"); + throw npe; + } + } + +} \ No newline at end of file