From 2ad4e20bece72c85bafc537df33114048c524660 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Thu, 9 Mar 2023 23:08:06 +0100 Subject: [PATCH 1/7] BAEL-6206 code for the JetBrains @Contract annotation article --- jetbrains/README.md | 5 + jetbrains/pom.xml | 37 ++++++ .../java/com/baeldung/annotations/Demo.java | 112 ++++++++++++++++++ .../java/com/baeldung/annotations/Person.java | 15 +++ pom.xml | 4 +- 5 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 jetbrains/README.md create mode 100644 jetbrains/pom.xml create mode 100644 jetbrains/src/main/java/com/baeldung/annotations/Demo.java create mode 100644 jetbrains/src/main/java/com/baeldung/annotations/Person.java diff --git a/jetbrains/README.md b/jetbrains/README.md new file mode 100644 index 0000000000..a63d4dffba --- /dev/null +++ b/jetbrains/README.md @@ -0,0 +1,5 @@ +## Jetbrains + +This module contains articles about Jetbrains' libraries. + +### Relevant articles: diff --git a/jetbrains/pom.xml b/jetbrains/pom.xml new file mode 100644 index 0000000000..a10fd3b913 --- /dev/null +++ b/jetbrains/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + jetbrains + 1.0-SNAPSHOT + jetbrains + jar + http://maven.apache.org + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${apache.commons.version} + + + org.jetbrains + annotations + ${jetbrains.annotations.version} + + + + + 3.12.0 + 24.0.1 + + + \ No newline at end of file diff --git a/jetbrains/src/main/java/com/baeldung/annotations/Demo.java b/jetbrains/src/main/java/com/baeldung/annotations/Demo.java new file mode 100644 index 0000000000..3638d13581 --- /dev/null +++ b/jetbrains/src/main/java/com/baeldung/annotations/Demo.java @@ -0,0 +1,112 @@ +package com.baeldung.annotations; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Contract; + +public class Demo { + + @Contract("_ -> new") + Person fromName(String name) { + return new Person().withName(name); + } + + @Contract(" -> fail") + void alwaysFail() { + throw new RuntimeException(); + } + + @Contract(" -> fail") + void doNothingWithWrongContract() { + + } + + @Contract("_, null -> null; null, _ -> param2; _, !null -> !null") + String concatenateOnlyIfSecondArgumentIsNotNull(String head, String tail) { + if (tail == null) { + return null; + } + if (head == null) { + return tail; + } + return head + tail; + } + + void uselessNullCheck() { + String head = "1234"; + String tail = "5678"; + String concatenation = concatenateOnlyIfSecondArgumentIsNotNull(head, tail); + if (concatenation != null) { + System.out.println(concatenation); + } + } + + void uselessNullCheckOnInferredAnnotation() { + if (StringUtils.isEmpty(null)) { + System.out.println("baeldung"); + } + } + + @Contract(pure = true) + String replace(String string, char oldChar, char newChar) { + return string.replace(oldChar, newChar); + } + + @Contract(value = "true -> false; false -> true", pure = true) + boolean not(boolean input) { + return !input; + } + + @Contract("true -> new") + void contractExpectsWrongParameterType(List integers) { + + } + + @Contract("_, _ -> new") + void contractExpectsMoreParametersThanMethodHas(String s) { + + } + + @Contract("_ -> _; null -> !null") + String secondContractClauseNotReachable(String s) { + return ""; + } + + @Contract("_ -> true") + void contractExpectsWrongReturnType(String s) { + + } + + // NB: the following examples demonstrate how to use the mutates attribute of the annotation + // This attribute is currently experimental and could be changed or removed in the future + @Contract(mutates = "param") + void incrementArrayFirstElement(Integer[] integers) { + if (integers.length > 0) { + integers[0] = integers[0] + 1; + } + } + + @Contract(pure = true, mutates = "param") + void impossibleToMutateParamInPureFunction(List strings) { + if (strings != null) { + strings.forEach(System.out::println); + } + } + + @Contract(mutates = "param3") + void impossibleToMutateThirdParamWhenMethodHasOnlyTwoParams(int a, int b) { + + } + + @Contract(mutates = "param") + void impossibleToMutableImmutableType(String s) { + + } + + @Contract(mutates = "this") + static void impossibleToMutateThisInStaticMethod() { + + } + +} diff --git a/jetbrains/src/main/java/com/baeldung/annotations/Person.java b/jetbrains/src/main/java/com/baeldung/annotations/Person.java new file mode 100644 index 0000000000..086b73b47f --- /dev/null +++ b/jetbrains/src/main/java/com/baeldung/annotations/Person.java @@ -0,0 +1,15 @@ +package com.baeldung.annotations; + +import org.jetbrains.annotations.Contract; + +public class Person { + + String name; + + @Contract("_ -> this") + Person withName(String name) { + this.name = name; + return this; + } + +} diff --git a/pom.xml b/pom.xml index 6ef6abd805..67353d9839 100644 --- a/pom.xml +++ b/pom.xml @@ -352,6 +352,7 @@ java-jdi java-websocket + jetbrains jhipster-5 jmh @@ -730,7 +731,7 @@ spring-boot-modules/spring-boot-react spring-ejb-modules/ejb-beans vaadin - vavr-modules + vavr-modules @@ -933,7 +934,6 @@ asm atomikos atomix - bazel code-generation From e37ddec99d002c803141d9e42458a3efd2060df6 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 17 Mar 2023 16:18:16 +0200 Subject: [PATCH 2/7] JAVA-17429 Upgrade to latest spring-boot-2 (#13443) From 66c0ce4b5f504447b535c9a6ef316a82f210bcb1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 17 Mar 2023 16:29:57 +0200 Subject: [PATCH 3/7] fix multiple failures --- jmeter/pom.xml | 10 ++++++++-- jmeter/src/main/resources/FileExtractionExample.jmx | 2 +- spring-batch/pom.xml | 4 ++-- spring-reactive-modules/spring-5-data-reactive/pom.xml | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/jmeter/pom.xml b/jmeter/pom.xml index acd823b74f..d349fc526b 100644 --- a/jmeter/pom.xml +++ b/jmeter/pom.xml @@ -48,8 +48,15 @@ com.lazerycode.jmeter jmeter-maven-plugin - ${jmeter.version} + 3.7.0 + + + configuration + + configure + + jmeter-tests @@ -66,7 +73,6 @@ - 2.6.0 diff --git a/jmeter/src/main/resources/FileExtractionExample.jmx b/jmeter/src/main/resources/FileExtractionExample.jmx index 961b6f143f..a86300ea01 100644 --- a/jmeter/src/main/resources/FileExtractionExample.jmx +++ b/jmeter/src/main/resources/FileExtractionExample.jmx @@ -57,7 +57,7 @@ false - FileWriter fWriter = new FileWriter("/result.txt", true); + FileWriter fWriter = new FileWriter("<path>/result.txt", true); BufferedWriter buff = new BufferedWriter(fWriter); buff.write("Response Code : " + ctx.getPreviousResult().getResponseCode()); diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index 32126fec9b..e9d3afa376 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -28,13 +28,13 @@ javax.xml.bind jaxb-api ${jaxb.version} - runtime + org.glassfish.jaxb jaxb-runtime ${jaxb.version} - runtime + diff --git a/spring-reactive-modules/spring-5-data-reactive/pom.xml b/spring-reactive-modules/spring-5-data-reactive/pom.xml index bf5170c621..0ed997b3f4 100644 --- a/spring-reactive-modules/spring-5-data-reactive/pom.xml +++ b/spring-reactive-modules/spring-5-data-reactive/pom.xml @@ -42,6 +42,7 @@ org.projectlombok lombok + 1.18.22 io.projectreactor From 985836155c4cea6404e457636f7c430b5e61819d Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Fri, 17 Mar 2023 16:41:16 +0200 Subject: [PATCH 4/7] [JAVA-18801] Fixed integration tests (#13617) * [JAVA-18801] Fixed integration tests * [JAVA-18801] Clean up --- apache-kafka/pom.xml | 28 +++++++++++++++---- .../com/baeldung/flink/FlinkDataPipeline.java | 12 ++++---- .../baeldung/flink/connector/Consumers.java | 10 +++---- .../baeldung/flink/connector/Producers.java | 10 +++---- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml index 7bde041f32..915583fed8 100644 --- a/apache-kafka/pom.xml +++ b/apache-kafka/pom.xml @@ -35,12 +35,12 @@ org.apache.flink - flink-connector-kafka-0.11_2.11 + flink-connector-kafka ${flink.version} org.apache.flink - flink-streaming-java_2.11 + flink-streaming-java ${flink.version} @@ -67,7 +67,7 @@ org.apache.flink - flink-test-utils_2.11 + flink-test-utils ${flink.version} test @@ -163,11 +163,29 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.time=ALL-UNNAMED + --add-opens java.base/java.nio=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + + + + + + + + - 2.8.0 + 3.4.0 1.15.3 1.15.3 - 1.5.0 + 1.16.1 3.0.0 2.4.8 0.8.1-spark3.0-s_2.12 diff --git a/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java b/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java index 4502b628b2..8d15b79a63 100644 --- a/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java +++ b/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java @@ -9,8 +9,8 @@ import org.apache.flink.streaming.api.TimeCharacteristic; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; import static com.baeldung.flink.connector.Consumers.*; import static com.baeldung.flink.connector.Producers.*; @@ -25,12 +25,12 @@ public class FlinkDataPipeline { StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment(); - FlinkKafkaConsumer011 flinkKafkaConsumer = createStringConsumerForTopic(inputTopic, address, consumerGroup); + FlinkKafkaConsumer flinkKafkaConsumer = createStringConsumerForTopic(inputTopic, address, consumerGroup); flinkKafkaConsumer.setStartFromEarliest(); DataStream stringInputStream = environment.addSource(flinkKafkaConsumer); - FlinkKafkaProducer011 flinkKafkaProducer = createStringProducer(outputTopic, address); + FlinkKafkaProducer flinkKafkaProducer = createStringProducer(outputTopic, address); stringInputStream.map(new WordsCapitalizer()) .addSink(flinkKafkaProducer); @@ -48,11 +48,11 @@ public class FlinkDataPipeline { environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); - FlinkKafkaConsumer011 flinkKafkaConsumer = createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup); + FlinkKafkaConsumer flinkKafkaConsumer = createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup); flinkKafkaConsumer.setStartFromEarliest(); flinkKafkaConsumer.assignTimestampsAndWatermarks(new InputMessageTimestampAssigner()); - FlinkKafkaProducer011 flinkKafkaProducer = createBackupProducer(outputTopic, kafkaAddress); + FlinkKafkaProducer flinkKafkaProducer = createBackupProducer(outputTopic, kafkaAddress); DataStream inputMessagesStream = environment.addSource(flinkKafkaConsumer); diff --git a/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java b/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java index c72cb8a2d6..358c9627f7 100644 --- a/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java +++ b/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java @@ -3,26 +3,26 @@ package com.baeldung.flink.connector; import com.baeldung.flink.model.InputMessage; import com.baeldung.flink.schema.InputMessageDeserializationSchema; import org.apache.flink.api.common.serialization.SimpleStringSchema; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import java.util.Properties; public class Consumers { - public static FlinkKafkaConsumer011 createStringConsumerForTopic(String topic, String kafkaAddress, String kafkaGroup) { + public static FlinkKafkaConsumer createStringConsumerForTopic(String topic, String kafkaAddress, String kafkaGroup) { Properties props = new Properties(); props.setProperty("bootstrap.servers", kafkaAddress); props.setProperty("group.id", kafkaGroup); - FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011<>(topic, new SimpleStringSchema(), props); + FlinkKafkaConsumer consumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), props); return consumer; } - public static FlinkKafkaConsumer011 createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup) { + public static FlinkKafkaConsumer createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup) { Properties properties = new Properties(); properties.setProperty("bootstrap.servers", kafkaAddress); properties.setProperty("group.id", kafkaGroup); - FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011(topic, new InputMessageDeserializationSchema(), properties); + FlinkKafkaConsumer consumer = new FlinkKafkaConsumer(topic, new InputMessageDeserializationSchema(), properties); return consumer; } diff --git a/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java b/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java index 8e6f3f8f37..a4cb2d70c2 100644 --- a/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java +++ b/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java @@ -3,15 +3,15 @@ package com.baeldung.flink.connector; import com.baeldung.flink.model.Backup; import com.baeldung.flink.schema.BackupSerializationSchema; import org.apache.flink.api.common.serialization.SimpleStringSchema; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011; +import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; public class Producers { - public static FlinkKafkaProducer011 createStringProducer(String topic, String kafkaAddress) { - return new FlinkKafkaProducer011<>(kafkaAddress, topic, new SimpleStringSchema()); + public static FlinkKafkaProducer createStringProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer<>(kafkaAddress, topic, new SimpleStringSchema()); } - public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) { - return new FlinkKafkaProducer011(kafkaAddress, topic, new BackupSerializationSchema()); + public static FlinkKafkaProducer createBackupProducer(String topic, String kafkaAddress) { + return new FlinkKafkaProducer(kafkaAddress, topic, new BackupSerializationSchema()); } } From a9d1be1031cd51b98a8acf98547d7ad2fb0b00ab Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 17 Mar 2023 16:50:59 +0200 Subject: [PATCH 5/7] JAVA-17609 Spring-data-rest SQLite upgrade to Spring-Boot-3 (#13559) --- persistence-modules/pom.xml | 3 +- persistence-modules/spring-data-rest/pom.xml | 33 ++++---- .../baeldung/books/dialect/SQLiteDialect.java | 78 ------------------- .../dialect/SQLiteIdentityColumnSupport.java | 22 ------ .../com/baeldung/books/models/Address.java | 12 +-- .../com/baeldung/books/models/Author.java | 18 ++--- .../java/com/baeldung/books/models/Book.java | 18 ++--- .../com/baeldung/books/models/Library.java | 16 ++-- .../com/baeldung/books/models/Subject.java | 10 +-- .../resources/persistence-sqlite.properties | 2 +- pom.xml | 2 + 11 files changed, 56 insertions(+), 158 deletions(-) delete mode 100644 persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java delete mode 100644 persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9606da4594..d7ff51b487 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -98,7 +98,8 @@ spring-data-mongodb-reactive spring-data-neo4j spring-data-redis - spring-data-rest + + spring-data-rest-2 spring-data-rest-querydsl spring-data-solr diff --git a/persistence-modules/spring-data-rest/pom.xml b/persistence-modules/spring-data-rest/pom.xml index f5601cb7ce..fa2cd033f5 100644 --- a/persistence-modules/spring-data-rest/pom.xml +++ b/persistence-modules/spring-data-rest/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -42,6 +42,17 @@ spring-boot-starter-test test + + org.hibernate.orm + hibernate-community-dialects + ${hibernate-community-dialects.version} + + + io.rest-assured + rest-assured + 3.3.0 + test + com.h2database h2 @@ -64,23 +75,6 @@ ${project.artifactId} - - com.mysema.maven - maven-apt-plugin - ${maven.version} - - - generate-sources - - process - - - target/generated-sources - com.querydsl.apt.jpa.JPAAnnotationProcessor - - - - org.springframework.boot spring-boot-maven-plugin @@ -91,6 +85,7 @@ com.baeldung.books.SpringDataRestApplication 1.0 + 6.1.7.Final \ No newline at end of file diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java deleted file mode 100644 index 6e840eec43..0000000000 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.baeldung.books.dialect; - -import org.hibernate.dialect.Dialect; -import org.hibernate.dialect.identity.IdentityColumnSupport; - -import java.sql.Types; - -public class SQLiteDialect extends Dialect { - - public SQLiteDialect() { - registerColumnType(Types.BIT, "integer"); - registerColumnType(Types.TINYINT, "tinyint"); - registerColumnType(Types.SMALLINT, "smallint"); - registerColumnType(Types.INTEGER, "integer"); - registerColumnType(Types.BIGINT, "bigint"); - registerColumnType(Types.FLOAT, "float"); - registerColumnType(Types.REAL, "real"); - registerColumnType(Types.DOUBLE, "double"); - registerColumnType(Types.NUMERIC, "numeric"); - registerColumnType(Types.DECIMAL, "decimal"); - registerColumnType(Types.CHAR, "char"); - registerColumnType(Types.VARCHAR, "varchar"); - registerColumnType(Types.LONGVARCHAR, "longvarchar"); - registerColumnType(Types.DATE, "date"); - registerColumnType(Types.TIME, "time"); - registerColumnType(Types.TIMESTAMP, "timestamp"); - registerColumnType(Types.BINARY, "blob"); - registerColumnType(Types.VARBINARY, "blob"); - registerColumnType(Types.LONGVARBINARY, "blob"); - registerColumnType(Types.BLOB, "blob"); - registerColumnType(Types.CLOB, "clob"); - registerColumnType(Types.BOOLEAN, "integer"); - } - - public IdentityColumnSupport getIdentityColumnSupport() { - return new SQLiteIdentityColumnSupport(); - } - - public boolean hasAlterTable() { - return false; - } - - public boolean dropConstraints() { - return false; - } - - public String getDropForeignKeyString() { - return ""; - } - - public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { - return ""; - } - - public String getAddPrimaryKeyConstraintString(String constraintName) { - return ""; - } - - public String getForUpdateString() { - return ""; - } - - public String getAddColumnString() { - return "add column"; - } - - public boolean supportsOuterJoinForUpdate() { - return false; - } - - public boolean supportsIfExistsBeforeTableName() { - return true; - } - - public boolean supportsCascadeDelete() { - return false; - } -} diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java deleted file mode 100644 index 682d82c6f1..0000000000 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.books.dialect; - -import org.hibernate.MappingException; -import org.hibernate.dialect.identity.IdentityColumnSupportImpl; - -public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl { - - @Override - public boolean supportsIdentityColumns() { - return true; - } - - @Override - public String getIdentitySelectString(String table, String column, int type) throws MappingException { - return "select last_insert_rowid()"; - } - - @Override - public String getIdentityColumnString(int type) throws MappingException { - return "integer"; - } -} diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java index 3c36db0f3c..2627c21615 100644 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java +++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java @@ -1,11 +1,11 @@ package com.baeldung.books.models; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; @Entity public class Address { diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java index aec2e62ebf..385113d800 100644 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java +++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java @@ -2,15 +2,15 @@ package com.baeldung.books.models; import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; @Entity public class Author { diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java index 7451b04b3b..ea3fb325c1 100644 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java +++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java @@ -2,15 +2,15 @@ package com.baeldung.books.models; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.ManyToOne; @Entity public class Book { diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java index 5f95169a9b..28a54dbd33 100644 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java +++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java @@ -2,14 +2,14 @@ package com.baeldung.books.models; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; import org.springframework.data.rest.core.annotation.RestResource; diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java index 11a4425fdd..28d16f5054 100644 --- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java +++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java @@ -1,10 +1,10 @@ package com.baeldung.books.models; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Subject { diff --git a/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties index b6b5f4e4d6..e570322a82 100644 --- a/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties +++ b/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties @@ -2,6 +2,6 @@ driverClassName=org.sqlite.JDBC url=jdbc:sqlite:memory:myDb?cache=shared username=sa password=sa -hibernate.dialect=com.baeldung.dialect.SQLiteDialect +spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect hibernate.hbm2ddl.auto=create-drop hibernate.show_sql=true diff --git a/pom.xml b/pom.xml index 6ef6abd805..b349c49f9e 100644 --- a/pom.xml +++ b/pom.xml @@ -904,6 +904,7 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + persistence-modules/spring-data-rest rule-engines-modules @@ -1162,6 +1163,7 @@ spring-swagger-codegen/custom-validations-opeanpi-codegen testing-modules/testing-assertions persistence-modules/fauna + persistence-modules/spring-data-rest rule-engines-modules From d54253f9b05f69e977b80ffc53915df53f5c0581 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Fri, 17 Mar 2023 22:06:56 +0530 Subject: [PATCH 6/7] BAEL-6157 - Using records with JPA (#13626) * BAEL-6157 - Using records with JPA * BAEL-6157 - Changing test class name * BAEL-6157 - Changing test class name * BAEL-6157 - Adding start-class to module --- spring-boot-modules/spring-boot-3/pom.xml | 2 + .../baeldung/recordswithjpa/QueryService.java | 42 +++++++++++ .../RecordsAsJpaApplication.java | 13 ++++ .../baeldung/recordswithjpa/entity/Book.java | 70 +++++++++++++++++++ .../recordswithjpa/records/BookRecord.java | 4 ++ .../records/CustomBookRecord.java | 4 ++ .../repository/BookRepository.java | 17 +++++ .../repository/CustomBookRepository.java | 9 +++ .../repository/CustomBookRepositoryImpl.java | 20 ++++++ .../QueryServiceIntegrationTest.java | 39 +++++++++++ .../RecordsAsJpaIntegrationTest.java | 30 ++++++++ .../BookRepositoryIntegrationTest.java | 19 +++++ .../CustomBookRepositoryIntegrationTest.java | 23 ++++++ 13 files changed, 292 insertions(+) create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java create mode 100644 spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml index cc8e7e1426..685df233ba 100644 --- a/spring-boot-modules/spring-boot-3/pom.xml +++ b/spring-boot-modules/spring-boot-3/pom.xml @@ -124,6 +124,8 @@ 1.5.2.Final 2.0.0 3.0.0-M7 + com.baeldung.sample.TodoApplication + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java new file mode 100644 index 0000000000..4c1e73e530 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java @@ -0,0 +1,42 @@ +package com.baeldung.recordswithjpa; + +import com.baeldung.recordswithjpa.entity.Book; +import com.baeldung.recordswithjpa.records.BookRecord; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class QueryService { + @PersistenceContext + private EntityManager entityManager; + + public List findAllBooks() { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(BookRecord.class); + Root root = query.from(Book.class); + query.select(cb + .construct(BookRecord.class, root.get("id"), root.get("title"), root.get("author"), root.get("isbn"))); + return entityManager.createQuery(query).getResultList(); + } + + public BookRecord findBookById(Long id) { + TypedQuery query = entityManager + .createQuery("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " + + "FROM Book b WHERE b.id = :id", BookRecord.class); + query.setParameter("id", id); + return query.getSingleResult(); + } + + public List findAllBooksUsingMapping() { + Query query = entityManager.createNativeQuery("SELECT * FROM book", "BookRecordMapping"); + return query.getResultList(); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java new file mode 100644 index 0000000000..d6eb1edec1 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.recordswithjpa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RecordsAsJpaApplication { + + public static void main(String[] args) { + SpringApplication.run(RecordsAsJpaApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java new file mode 100644 index 0000000000..9ea982e323 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java @@ -0,0 +1,70 @@ +package com.baeldung.recordswithjpa.entity; + +import com.baeldung.recordswithjpa.records.BookRecord; +import jakarta.persistence.*; + +@SqlResultSetMapping( + name = "BookRecordMapping", + classes = @ConstructorResult( + targetClass = BookRecord.class, + columns = { + @ColumnResult(name = "id", type = Long.class), + @ColumnResult(name = "title", type = String.class), + @ColumnResult(name = "author", type = String.class), + @ColumnResult(name = "isbn", type = String.class) + } + ) +) +@Entity +@Table(name = "book") +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String title; + private String author; + private String isbn; + + public Book() { + } + + public Book(Long id, String title, String author, String isbn) { + this.id = id; + this.title = title; + this.author = author; + this.isbn = isbn; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java new file mode 100644 index 0000000000..96968575d9 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java @@ -0,0 +1,4 @@ +package com.baeldung.recordswithjpa.records; + +public record BookRecord(Long id, String title, String author, String isbn) { +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java new file mode 100644 index 0000000000..35e9be9513 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java @@ -0,0 +1,4 @@ +package com.baeldung.recordswithjpa.records; + +public record CustomBookRecord(Long id, String title) { +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java new file mode 100644 index 0000000000..4ef5f17296 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java @@ -0,0 +1,17 @@ +package com.baeldung.recordswithjpa.repository; + +import com.baeldung.recordswithjpa.entity.Book; +import com.baeldung.recordswithjpa.records.BookRecord; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface BookRepository extends CrudRepository { + List findBookByAuthor(String author); + + @Query("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " + + "FROM Book b WHERE b.id = :id") + BookRecord findBookById(@Param("id") Long id); +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java new file mode 100644 index 0000000000..bb8002d70d --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.recordswithjpa.repository; + +import com.baeldung.recordswithjpa.records.CustomBookRecord; + +import java.util.List; + +public interface CustomBookRepository { + List findAllBooks(); +} diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java new file mode 100644 index 0000000000..8d420a9874 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java @@ -0,0 +1,20 @@ +package com.baeldung.recordswithjpa.repository; + +import com.baeldung.recordswithjpa.records.CustomBookRecord; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class CustomBookRepositoryImpl implements CustomBookRepository { + private final JdbcTemplate jdbcTemplate; + + public CustomBookRepositoryImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public List findAllBooks() { + return jdbcTemplate.query("SELECT id, title FROM book", (rs, rowNum) -> new CustomBookRecord(rs.getLong("id"), rs.getString("title"))); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java new file mode 100644 index 0000000000..011895e7fa --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.recordswithjpa; + +import com.baeldung.recordswithjpa.entity.Book; +import com.baeldung.recordswithjpa.records.BookRecord; +import com.baeldung.recordswithjpa.repository.BookRepository; +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.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class QueryServiceIntegrationTest extends RecordsAsJpaIntegrationTest { + + @Autowired + private QueryService queryService; + + + @Test + void findAllBooks() { + List allBooks = queryService.findAllBooks(); + assertEquals(3, allBooks.size()); + } + + @Test + void findBookById() { + BookRecord bookById = queryService.findBookById(1L); + assertEquals("The Lord of the Rings", bookById.title()); + } + + @Test + void findAllBooksUsingMapping() { + List allBooksUsingMapping = queryService.findAllBooksUsingMapping(); + assertEquals(3, allBooksUsingMapping.size()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java new file mode 100644 index 0000000000..f0869dad48 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.recordswithjpa; + +import com.baeldung.recordswithjpa.entity.Book; +import com.baeldung.recordswithjpa.repository.BookRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class RecordsAsJpaIntegrationTest { + @Autowired + protected BookRepository bookRepository; + + @BeforeEach + void setUp() { + Book book = new Book(1L,"The Lord of the Rings", "J.R.R. Tolkien", "978-0544003415"); + Book book2 = new Book(2L,"The Hobbit", "J.R.R. Tolkien", "978-0547928227"); + Book book3 = new Book(3L,"Harry Potter and the Philosopher's Stone", "J.K. Rowling", "978-0747532699"); + + bookRepository.save(book); + bookRepository.save(book2); + bookRepository.save(book3); + } + + @AfterEach + void tearDown() { + bookRepository.deleteAll(); + } +} diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java new file mode 100644 index 0000000000..9173fea269 --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java @@ -0,0 +1,19 @@ +package com.baeldung.recordswithjpa.repository; + +import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest { + + @Test + void findBookByAuthor() { + assertEquals(2, bookRepository.findBookByAuthor("J.R.R. Tolkien").size()); + } + + @Test + void findBookById() { + assertEquals("The Lord of the Rings", bookRepository.findBookById(1L).title()); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java new file mode 100644 index 0000000000..866645429a --- /dev/null +++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java @@ -0,0 +1,23 @@ +package com.baeldung.recordswithjpa.repository; + +import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest; +import com.baeldung.recordswithjpa.records.CustomBookRecord; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CustomBookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest { + + @Autowired + private CustomBookRepository customBookRepository; + + @Test + void findAllBooks() { + List allBooks = customBookRepository.findAllBooks(); + assertEquals(3, allBooks.size()); + } +} \ No newline at end of file From 369c0fe796539020ba6d3f86f9bf6169ea73fdad Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 17 Mar 2023 18:39:33 +0200 Subject: [PATCH 7/7] fix feign build --- feign/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feign/pom.xml b/feign/pom.xml index 7338cf7508..f39adec607 100644 --- a/feign/pom.xml +++ b/feign/pom.xml @@ -103,7 +103,7 @@ com.baeldung.feign.soap - src/main/resources/users.xsd + ${project.basedir}/src/main/resources/users.xsd