From 3f56745e54ca5ebd53680efd9ee04d5afe5b26cb Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 17:10:39 +0530 Subject: [PATCH 01/23] upgrading to gradle 8.8 --- spring-boot/validation/build.gradle | 8 ++++---- .../gradle/wrapper/gradle-wrapper.jar | Bin 54711 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index ed9da0c53..eb662003a 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - springBootVersion = '2.3.1.RELEASE' + springBootVersion = '3.3.0' } repositories { mavenCentral() @@ -16,8 +16,8 @@ apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'io.reflectoring' -version = '0.0.1-SNAPSHOT' -sourceCompatibility = 11 +version = '0.0.1' +sourceCompatibility = 21 repositories { mavenCentral() @@ -39,4 +39,4 @@ dependencies { test{ useJUnitPlatform() -} \ No newline at end of file +} diff --git a/spring-boot/validation/gradle/wrapper/gradle-wrapper.jar b/spring-boot/validation/gradle/wrapper/gradle-wrapper.jar index 1ce6e58f1ce8ae3a3be37719a2180b5567cea91d..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 Date: Sun, 9 Jun 2024 17:48:38 +0530 Subject: [PATCH 02/23] removing deprecated syntax in build.gradle --- spring-boot/validation/build.gradle | 40 ++++++++++------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index eb662003a..62f492577 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -1,42 +1,30 @@ -buildscript { - ext { - springBootVersion = '3.3.0' - } - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - } +plugins { + id 'java' + id 'org.springframework.boot' version '3.3.0' + id 'io.spring.dependency-management' version '1.1.5' } -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' - group = 'io.reflectoring' version = '0.0.1' -sourceCompatibility = 21 + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} repositories { mavenCentral() } dependencies { - implementation('org.springframework.boot:spring-boot-starter-data-jpa') - implementation('org.springframework.boot:spring-boot-starter-validation') implementation('org.springframework.boot:spring-boot-starter-web') + implementation('org.springframework.boot:spring-boot-starter-validation') + implementation('org.springframework.boot:spring-boot-starter-data-jpa') runtimeOnly('com.h2database:h2') testImplementation('org.springframework.boot:spring-boot-starter-test') - testImplementation('org.junit.jupiter:junit-jupiter-engine:5.0.1') - - // these dependencies are needed when running with Java 11, since they - // are no longer part of the JDK - implementation('javax.xml.bind:jaxb-api:2.3.1') - implementation('org.javassist:javassist:3.23.1-GA') } -test{ +tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file From b0537f6f69faa8ff6cb88e38e06697b11b26fbf4 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 17:48:52 +0530 Subject: [PATCH 03/23] updating deps.txt --- spring-boot/validation/deps.txt | 868 ++++++-------------------------- 1 file changed, 144 insertions(+), 724 deletions(-) diff --git a/spring-boot/validation/deps.txt b/spring-boot/validation/deps.txt index 7a9158da4..db05dc342 100644 --- a/spring-boot/validation/deps.txt +++ b/spring-boot/validation/deps.txt @@ -1,735 +1,155 @@ +Starting a Gradle Daemon, 3 incompatible Daemons could not be reused, use --status for details > Task :dependencies ------------------------------------------------------------ -Root project +Root project 'validation' ------------------------------------------------------------ -annotationProcessor - Annotation processors and their dependencies for source set 'main'. -No dependencies - -apiElements - API elements for main. (n) -No dependencies - -archives - Configuration for archive artifacts. -No dependencies - -bootArchives - Configuration for Spring Boot archive artifacts. -No dependencies - -compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead). -No dependencies - -compileClasspath - Compile classpath for source set 'main'. -+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot:2.0.5.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE -| | | | \--- org.springframework:spring-jcl:5.0.9.RELEASE -| | | \--- org.springframework:spring-context:5.0.9.RELEASE -| | | +--- org.springframework:spring-aop:5.0.9.RELEASE -| | | | +--- org.springframework:spring-beans:5.0.9.RELEASE -| | | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-expression:5.0.9.RELEASE -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE -| | | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-starter-logging:2.0.5.RELEASE -| | | +--- ch.qos.logback:logback-classic:1.2.3 -| | | | +--- ch.qos.logback:logback-core:1.2.3 -| | | | \--- org.slf4j:slf4j-api:1.7.25 -| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.10.0 -| | | | +--- org.slf4j:slf4j-api:1.7.25 -| | | | \--- org.apache.logging.log4j:log4j-api:2.10.0 -| | | \--- org.slf4j:jul-to-slf4j:1.7.25 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.yaml:snakeyaml:1.19 -| +--- org.springframework.boot:spring-boot-starter-aop:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | \--- org.aspectj:aspectjweaver:1.8.13 -| +--- org.springframework.boot:spring-boot-starter-jdbc:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- com.zaxxer:HikariCP:2.7.9 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | \--- org.springframework:spring-jdbc:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-tx:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- javax.transaction:javax.transaction-api:1.2 -| +--- org.hibernate:hibernate-core:5.2.17.Final -| | +--- org.jboss.logging:jboss-logging:3.3.1.Final -> 3.3.2.Final -| | +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final -> 1.0.2.Final -| | +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA -| | +--- antlr:antlr:2.7.7 -| | +--- org.jboss:jandex:2.0.3.Final -| | +--- com.fasterxml:classmate:1.3.0 -> 1.3.4 -| | +--- dom4j:dom4j:1.6.1 -| | \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final -| | \--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.2.Final -| +--- org.springframework.data:spring-data-jpa:2.0.10.RELEASE -| | +--- org.springframework.data:spring-data-commons:2.0.10.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- org.springframework:spring-orm:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-jdbc:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.slf4j:slf4j-api:1.7.25 -| \--- org.springframework:spring-aspects:5.0.9.RELEASE -| \--- org.aspectj:aspectjweaver:1.8.13 -+--- org.springframework.boot:spring-boot-starter-validation -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| \--- org.hibernate.validator:hibernate-validator:6.0.12.Final -| +--- javax.validation:validation-api:2.0.1.Final -| +--- org.jboss.logging:jboss-logging:3.3.2.Final -| \--- com.fasterxml:classmate:1.3.4 -+--- org.springframework.boot:spring-boot-starter-web -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-starter-json:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-web:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- com.fasterxml.jackson.core:jackson-databind:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6 -| | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| +--- org.springframework.boot:spring-boot-starter-tomcat:2.0.5.RELEASE -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| | +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| +--- org.hibernate.validator:hibernate-validator:6.0.12.Final (*) -| +--- org.springframework:spring-web:5.0.9.RELEASE (*) -| \--- org.springframework:spring-webmvc:5.0.9.RELEASE -| +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-expression:5.0.9.RELEASE (*) -| \--- org.springframework:spring-web:5.0.9.RELEASE (*) -+--- javax.xml.bind:jaxb-api:2.3.1 -| \--- javax.activation:javax.activation-api:1.2.0 -\--- org.javassist:javassist:3.23.1-GA - -compileOnly - Compile only dependencies for source set 'main'. -No dependencies - -default - Configuration for default artifacts. -+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot:2.0.5.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE -| | | | \--- org.springframework:spring-jcl:5.0.9.RELEASE -| | | \--- org.springframework:spring-context:5.0.9.RELEASE -| | | +--- org.springframework:spring-aop:5.0.9.RELEASE -| | | | +--- org.springframework:spring-beans:5.0.9.RELEASE -| | | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-expression:5.0.9.RELEASE -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE -| | | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-starter-logging:2.0.5.RELEASE -| | | +--- ch.qos.logback:logback-classic:1.2.3 -| | | | +--- ch.qos.logback:logback-core:1.2.3 -| | | | \--- org.slf4j:slf4j-api:1.7.25 -| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.10.0 -| | | | +--- org.slf4j:slf4j-api:1.7.25 -| | | | \--- org.apache.logging.log4j:log4j-api:2.10.0 -| | | \--- org.slf4j:jul-to-slf4j:1.7.25 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.yaml:snakeyaml:1.19 -| +--- org.springframework.boot:spring-boot-starter-aop:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | \--- org.aspectj:aspectjweaver:1.8.13 -| +--- org.springframework.boot:spring-boot-starter-jdbc:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- com.zaxxer:HikariCP:2.7.9 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | \--- org.springframework:spring-jdbc:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-tx:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- javax.transaction:javax.transaction-api:1.2 -| +--- org.hibernate:hibernate-core:5.2.17.Final -| | +--- org.jboss.logging:jboss-logging:3.3.1.Final -> 3.3.2.Final -| | +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final -> 1.0.2.Final -| | +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA -| | +--- antlr:antlr:2.7.7 -| | +--- org.jboss:jandex:2.0.3.Final -| | +--- com.fasterxml:classmate:1.3.0 -> 1.3.4 -| | +--- dom4j:dom4j:1.6.1 -| | \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final -| | \--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.2.Final -| +--- org.springframework.data:spring-data-jpa:2.0.10.RELEASE -| | +--- org.springframework.data:spring-data-commons:2.0.10.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- org.springframework:spring-orm:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-jdbc:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.slf4j:slf4j-api:1.7.25 -| \--- org.springframework:spring-aspects:5.0.9.RELEASE -| \--- org.aspectj:aspectjweaver:1.8.13 -+--- org.springframework.boot:spring-boot-starter-validation -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| \--- org.hibernate.validator:hibernate-validator:6.0.12.Final -| +--- javax.validation:validation-api:2.0.1.Final -| +--- org.jboss.logging:jboss-logging:3.3.2.Final -| \--- com.fasterxml:classmate:1.3.4 -+--- org.springframework.boot:spring-boot-starter-web -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-starter-json:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-web:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- com.fasterxml.jackson.core:jackson-databind:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6 -| | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| +--- org.springframework.boot:spring-boot-starter-tomcat:2.0.5.RELEASE -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| | +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| +--- org.hibernate.validator:hibernate-validator:6.0.12.Final (*) -| +--- org.springframework:spring-web:5.0.9.RELEASE (*) -| \--- org.springframework:spring-webmvc:5.0.9.RELEASE -| +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-expression:5.0.9.RELEASE (*) -| \--- org.springframework:spring-web:5.0.9.RELEASE (*) -+--- javax.xml.bind:jaxb-api:2.3.1 -| \--- javax.activation:javax.activation-api:1.2.0 -+--- org.javassist:javassist:3.23.1-GA -\--- com.h2database:h2 -> 1.4.197 - -implementation - Implementation only dependencies for source set 'main'. (n) -+--- org.springframework.boot:spring-boot-starter-data-jpa (n) -+--- org.springframework.boot:spring-boot-starter-validation (n) -+--- org.springframework.boot:spring-boot-starter-web (n) -+--- javax.xml.bind:jaxb-api:2.3.1 (n) -\--- org.javassist:javassist:3.23.1-GA (n) - -runtime - Runtime dependencies for source set 'main' (deprecated, use 'runtimeOnly' instead). -No dependencies - runtimeClasspath - Runtime classpath of source set 'main'. -+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot:2.0.5.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE -| | | | \--- org.springframework:spring-jcl:5.0.9.RELEASE -| | | \--- org.springframework:spring-context:5.0.9.RELEASE -| | | +--- org.springframework:spring-aop:5.0.9.RELEASE -| | | | +--- org.springframework:spring-beans:5.0.9.RELEASE -| | | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-expression:5.0.9.RELEASE -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE -| | | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-starter-logging:2.0.5.RELEASE -| | | +--- ch.qos.logback:logback-classic:1.2.3 -| | | | +--- ch.qos.logback:logback-core:1.2.3 -| | | | \--- org.slf4j:slf4j-api:1.7.25 -| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.10.0 -| | | | +--- org.slf4j:slf4j-api:1.7.25 -| | | | \--- org.apache.logging.log4j:log4j-api:2.10.0 -| | | \--- org.slf4j:jul-to-slf4j:1.7.25 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.yaml:snakeyaml:1.19 -| +--- org.springframework.boot:spring-boot-starter-aop:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | \--- org.aspectj:aspectjweaver:1.8.13 -| +--- org.springframework.boot:spring-boot-starter-jdbc:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- com.zaxxer:HikariCP:2.7.9 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | \--- org.springframework:spring-jdbc:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-tx:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- javax.transaction:javax.transaction-api:1.2 -| +--- org.hibernate:hibernate-core:5.2.17.Final -| | +--- org.jboss.logging:jboss-logging:3.3.1.Final -> 3.3.2.Final -| | +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final -> 1.0.2.Final -| | +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA -| | +--- antlr:antlr:2.7.7 -| | +--- org.jboss:jandex:2.0.3.Final -| | +--- com.fasterxml:classmate:1.3.0 -> 1.3.4 -| | +--- dom4j:dom4j:1.6.1 -| | \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final -| | \--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.2.Final -| +--- org.springframework.data:spring-data-jpa:2.0.10.RELEASE -| | +--- org.springframework.data:spring-data-commons:2.0.10.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- org.springframework:spring-orm:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-jdbc:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.slf4j:slf4j-api:1.7.25 -| \--- org.springframework:spring-aspects:5.0.9.RELEASE -| \--- org.aspectj:aspectjweaver:1.8.13 -+--- org.springframework.boot:spring-boot-starter-validation -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| \--- org.hibernate.validator:hibernate-validator:6.0.12.Final -| +--- javax.validation:validation-api:2.0.1.Final -| +--- org.jboss.logging:jboss-logging:3.3.2.Final -| \--- com.fasterxml:classmate:1.3.4 -+--- org.springframework.boot:spring-boot-starter-web -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-starter-json:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-web:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- com.fasterxml.jackson.core:jackson-databind:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6 -| | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| +--- org.springframework.boot:spring-boot-starter-tomcat:2.0.5.RELEASE -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| | +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| +--- org.hibernate.validator:hibernate-validator:6.0.12.Final (*) -| +--- org.springframework:spring-web:5.0.9.RELEASE (*) -| \--- org.springframework:spring-webmvc:5.0.9.RELEASE -| +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-expression:5.0.9.RELEASE (*) -| \--- org.springframework:spring-web:5.0.9.RELEASE (*) -+--- javax.xml.bind:jaxb-api:2.3.1 -| \--- javax.activation:javax.activation-api:1.2.0 -+--- org.javassist:javassist:3.23.1-GA -\--- com.h2database:h2 -> 1.4.197 - -runtimeElements - Elements of runtime for main. (n) -No dependencies - -runtimeOnly - Runtime only dependencies for source set 'main'. (n) -\--- com.h2database:h2 (n) - -testAnnotationProcessor - Annotation processors and their dependencies for source set 'test'. -No dependencies - -testCompile - Dependencies for source set 'test' (deprecated, use 'testImplementation' instead). -No dependencies - -testCompileClasspath - Compile classpath for source set 'test'. -+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot:2.0.5.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE -| | | | \--- org.springframework:spring-jcl:5.0.9.RELEASE -| | | \--- org.springframework:spring-context:5.0.9.RELEASE -| | | +--- org.springframework:spring-aop:5.0.9.RELEASE -| | | | +--- org.springframework:spring-beans:5.0.9.RELEASE -| | | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-expression:5.0.9.RELEASE -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE -| | | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-starter-logging:2.0.5.RELEASE -| | | +--- ch.qos.logback:logback-classic:1.2.3 -| | | | +--- ch.qos.logback:logback-core:1.2.3 -| | | | \--- org.slf4j:slf4j-api:1.7.25 -| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.10.0 -| | | | +--- org.slf4j:slf4j-api:1.7.25 -| | | | \--- org.apache.logging.log4j:log4j-api:2.10.0 -| | | \--- org.slf4j:jul-to-slf4j:1.7.25 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.yaml:snakeyaml:1.19 -| +--- org.springframework.boot:spring-boot-starter-aop:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | \--- org.aspectj:aspectjweaver:1.8.13 -| +--- org.springframework.boot:spring-boot-starter-jdbc:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- com.zaxxer:HikariCP:2.7.9 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | \--- org.springframework:spring-jdbc:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-tx:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- javax.transaction:javax.transaction-api:1.2 -| +--- org.hibernate:hibernate-core:5.2.17.Final -| | +--- org.jboss.logging:jboss-logging:3.3.1.Final -> 3.3.2.Final -| | +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final -> 1.0.2.Final -| | +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA -| | +--- antlr:antlr:2.7.7 -| | +--- org.jboss:jandex:2.0.3.Final -| | +--- com.fasterxml:classmate:1.3.0 -> 1.3.4 -| | +--- dom4j:dom4j:1.6.1 -| | \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final -| | \--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.2.Final -| +--- org.springframework.data:spring-data-jpa:2.0.10.RELEASE -| | +--- org.springframework.data:spring-data-commons:2.0.10.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- org.springframework:spring-orm:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-jdbc:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.slf4j:slf4j-api:1.7.25 -| \--- org.springframework:spring-aspects:5.0.9.RELEASE -| \--- org.aspectj:aspectjweaver:1.8.13 -+--- org.springframework.boot:spring-boot-starter-validation -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| \--- org.hibernate.validator:hibernate-validator:6.0.12.Final -| +--- javax.validation:validation-api:2.0.1.Final -| +--- org.jboss.logging:jboss-logging:3.3.2.Final -| \--- com.fasterxml:classmate:1.3.4 -+--- org.springframework.boot:spring-boot-starter-web -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-starter-json:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-web:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- com.fasterxml.jackson.core:jackson-databind:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6 -| | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| +--- org.springframework.boot:spring-boot-starter-tomcat:2.0.5.RELEASE -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| | +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| +--- org.hibernate.validator:hibernate-validator:6.0.12.Final (*) -| +--- org.springframework:spring-web:5.0.9.RELEASE (*) -| \--- org.springframework:spring-webmvc:5.0.9.RELEASE -| +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-expression:5.0.9.RELEASE (*) -| \--- org.springframework:spring-web:5.0.9.RELEASE (*) -+--- javax.xml.bind:jaxb-api:2.3.1 -| \--- javax.activation:javax.activation-api:1.2.0 -+--- org.javassist:javassist:3.23.1-GA -+--- org.springframework.boot:spring-boot-starter-test -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE -| | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-test-autoconfigure:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE (*) -| | \--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE (*) -| +--- com.jayway.jsonpath:json-path:2.4.0 -| | +--- net.minidev:json-smart:2.3 -| | | \--- net.minidev:accessors-smart:1.2 -| | | \--- org.ow2.asm:asm:5.0.4 -| | \--- org.slf4j:slf4j-api:1.7.25 -| +--- junit:junit:4.12 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.assertj:assertj-core:3.9.1 -| +--- org.mockito:mockito-core:2.15.0 -| | +--- net.bytebuddy:byte-buddy:1.7.9 -> 1.7.11 -| | +--- net.bytebuddy:byte-buddy-agent:1.7.9 -> 1.7.11 -| | \--- org.objenesis:objenesis:2.6 -| +--- org.hamcrest:hamcrest-core:1.3 -| +--- org.hamcrest:hamcrest-library:1.3 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.skyscreamer:jsonassert:1.5.0 -| | \--- com.vaadin.external.google:android-json:0.0.20131108.vaadin1 -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-test:5.0.9.RELEASE -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| \--- org.xmlunit:xmlunit-core:2.5.1 -\--- org.junit.jupiter:junit-jupiter-engine:5.0.1 - +--- org.junit.platform:junit-platform-engine:1.0.1 - | +--- org.junit.platform:junit-platform-commons:1.0.1 -> 1.1.1 - | | \--- org.apiguardian:apiguardian-api:1.0.0 - | \--- org.opentest4j:opentest4j:1.0.0 - \--- org.junit.jupiter:junit-jupiter-api:5.0.1 -> 5.1.1 - +--- org.apiguardian:apiguardian-api:1.0.0 - +--- org.opentest4j:opentest4j:1.0.0 - \--- org.junit.platform:junit-platform-commons:1.1.1 (*) - -testCompileOnly - Compile only dependencies for source set 'test'. -No dependencies - -testImplementation - Implementation only dependencies for source set 'test'. (n) -+--- org.springframework.boot:spring-boot-starter-test (n) -\--- org.junit.jupiter:junit-jupiter-engine:5.0.1 (n) - -testRuntime - Runtime dependencies for source set 'test' (deprecated, use 'testRuntimeOnly' instead). -No dependencies - -testRuntimeClasspath - Runtime classpath of source set 'test'. -+--- org.springframework.boot:spring-boot-starter-data-jpa -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot:2.0.5.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE -| | | | \--- org.springframework:spring-jcl:5.0.9.RELEASE -| | | \--- org.springframework:spring-context:5.0.9.RELEASE -| | | +--- org.springframework:spring-aop:5.0.9.RELEASE -| | | | +--- org.springframework:spring-beans:5.0.9.RELEASE -| | | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-expression:5.0.9.RELEASE -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE -| | | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| | +--- org.springframework.boot:spring-boot-starter-logging:2.0.5.RELEASE -| | | +--- ch.qos.logback:logback-classic:1.2.3 -| | | | +--- ch.qos.logback:logback-core:1.2.3 -| | | | \--- org.slf4j:slf4j-api:1.7.25 -| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.10.0 -| | | | +--- org.slf4j:slf4j-api:1.7.25 -| | | | \--- org.apache.logging.log4j:log4j-api:2.10.0 -| | | \--- org.slf4j:jul-to-slf4j:1.7.25 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.yaml:snakeyaml:1.19 -| +--- org.springframework.boot:spring-boot-starter-aop:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | \--- org.aspectj:aspectjweaver:1.8.13 -| +--- org.springframework.boot:spring-boot-starter-jdbc:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- com.zaxxer:HikariCP:2.7.9 -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | \--- org.springframework:spring-jdbc:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-tx:5.0.9.RELEASE -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- javax.transaction:javax.transaction-api:1.2 -| +--- org.hibernate:hibernate-core:5.2.17.Final -| | +--- org.jboss.logging:jboss-logging:3.3.1.Final -> 3.3.2.Final -| | +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final -> 1.0.2.Final -| | +--- org.javassist:javassist:3.22.0-GA -> 3.23.1-GA -| | +--- antlr:antlr:2.7.7 -| | +--- org.jboss:jandex:2.0.3.Final -| | +--- com.fasterxml:classmate:1.3.0 -> 1.3.4 -| | +--- dom4j:dom4j:1.6.1 -| | \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final -| | \--- org.jboss.logging:jboss-logging:3.3.0.Final -> 3.3.2.Final -| +--- org.springframework.data:spring-data-jpa:2.0.10.RELEASE -| | +--- org.springframework.data:spring-data-commons:2.0.10.RELEASE -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.slf4j:slf4j-api:1.7.25 -| | +--- org.springframework:spring-orm:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | | +--- org.springframework:spring-jdbc:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-tx:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | \--- org.slf4j:slf4j-api:1.7.25 -| \--- org.springframework:spring-aspects:5.0.9.RELEASE -| \--- org.aspectj:aspectjweaver:1.8.13 -+--- org.springframework.boot:spring-boot-starter-validation -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| \--- org.hibernate.validator:hibernate-validator:6.0.12.Final -| +--- javax.validation:validation-api:2.0.1.Final -| +--- org.jboss.logging:jboss-logging:3.3.2.Final -| \--- com.fasterxml:classmate:1.3.4 -+--- org.springframework.boot:spring-boot-starter-web -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-starter-json:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| | +--- org.springframework:spring-web:5.0.9.RELEASE -| | | +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| | | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| | +--- com.fasterxml.jackson.core:jackson-databind:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | \--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6 -| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -| | | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.6 -| | +--- com.fasterxml.jackson.core:jackson-core:2.9.6 -| | \--- com.fasterxml.jackson.core:jackson-databind:2.9.6 (*) -| +--- org.springframework.boot:spring-boot-starter-tomcat:2.0.5.RELEASE -| | +--- javax.annotation:javax.annotation-api:1.3.2 -| | +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| | +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.34 -| | \--- org.apache.tomcat.embed:tomcat-embed-core:8.5.34 -| +--- org.hibernate.validator:hibernate-validator:6.0.12.Final (*) -| +--- org.springframework:spring-web:5.0.9.RELEASE (*) -| \--- org.springframework:spring-webmvc:5.0.9.RELEASE -| +--- org.springframework:spring-aop:5.0.9.RELEASE (*) -| +--- org.springframework:spring-beans:5.0.9.RELEASE (*) -| +--- org.springframework:spring-context:5.0.9.RELEASE (*) -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-expression:5.0.9.RELEASE (*) -| \--- org.springframework:spring-web:5.0.9.RELEASE (*) -+--- javax.xml.bind:jaxb-api:2.3.1 -| \--- javax.activation:javax.activation-api:1.2.0 -+--- org.javassist:javassist:3.23.1-GA -+--- com.h2database:h2 -> 1.4.197 -+--- org.springframework.boot:spring-boot-starter-test -> 2.0.5.RELEASE -| +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE -| | \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*) -| +--- org.springframework.boot:spring-boot-test-autoconfigure:2.0.5.RELEASE -| | +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE (*) -| | \--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE (*) -| +--- com.jayway.jsonpath:json-path:2.4.0 -| | +--- net.minidev:json-smart:2.3 -| | | \--- net.minidev:accessors-smart:1.2 -| | | \--- org.ow2.asm:asm:5.0.4 -| | \--- org.slf4j:slf4j-api:1.7.25 -| +--- junit:junit:4.12 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.assertj:assertj-core:3.9.1 -| +--- org.mockito:mockito-core:2.15.0 -| | +--- net.bytebuddy:byte-buddy:1.7.9 -> 1.7.11 -| | +--- net.bytebuddy:byte-buddy-agent:1.7.9 -> 1.7.11 -| | \--- org.objenesis:objenesis:2.6 -| +--- org.hamcrest:hamcrest-core:1.3 -| +--- org.hamcrest:hamcrest-library:1.3 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.skyscreamer:jsonassert:1.5.0 -| | \--- com.vaadin.external.google:android-json:0.0.20131108.vaadin1 -| +--- org.springframework:spring-core:5.0.9.RELEASE (*) -| +--- org.springframework:spring-test:5.0.9.RELEASE -| | \--- org.springframework:spring-core:5.0.9.RELEASE (*) -| \--- org.xmlunit:xmlunit-core:2.5.1 -\--- org.junit.jupiter:junit-jupiter-engine:5.0.1 - +--- org.junit.platform:junit-platform-engine:1.0.1 - | +--- org.junit.platform:junit-platform-commons:1.0.1 -> 1.1.1 - | | \--- org.apiguardian:apiguardian-api:1.0.0 - | \--- org.opentest4j:opentest4j:1.0.0 - \--- org.junit.jupiter:junit-jupiter-api:5.0.1 -> 5.1.1 - +--- org.apiguardian:apiguardian-api:1.0.0 - +--- org.opentest4j:opentest4j:1.0.0 - \--- org.junit.platform:junit-platform-commons:1.1.1 (*) - -testRuntimeOnly - Runtime only dependencies for source set 'test'. (n) -No dependencies - -(*) - dependencies omitted (listed previously) - -(n) - Not resolved (configuration is not meant to be resolved) ++--- org.springframework.boot:spring-boot-starter-web -> 3.3.0 +| +--- org.springframework.boot:spring-boot-starter:3.3.0 +| | +--- org.springframework.boot:spring-boot:3.3.0 +| | | +--- org.springframework:spring-core:6.1.8 +| | | | \--- org.springframework:spring-jcl:6.1.8 +| | | \--- org.springframework:spring-context:6.1.8 +| | | +--- org.springframework:spring-aop:6.1.8 +| | | | +--- org.springframework:spring-beans:6.1.8 +| | | | | \--- org.springframework:spring-core:6.1.8 (*) +| | | | \--- org.springframework:spring-core:6.1.8 (*) +| | | +--- org.springframework:spring-beans:6.1.8 (*) +| | | +--- org.springframework:spring-core:6.1.8 (*) +| | | +--- org.springframework:spring-expression:6.1.8 +| | | | \--- org.springframework:spring-core:6.1.8 (*) +| | | \--- io.micrometer:micrometer-observation:1.12.6 -> 1.13.0 +| | | \--- io.micrometer:micrometer-commons:1.13.0 +| | +--- org.springframework.boot:spring-boot-autoconfigure:3.3.0 +| | | \--- org.springframework.boot:spring-boot:3.3.0 (*) +| | +--- org.springframework.boot:spring-boot-starter-logging:3.3.0 +| | | +--- ch.qos.logback:logback-classic:1.5.6 +| | | | +--- ch.qos.logback:logback-core:1.5.6 +| | | | \--- org.slf4j:slf4j-api:2.0.13 +| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.23.1 +| | | | +--- org.apache.logging.log4j:log4j-api:2.23.1 +| | | | \--- org.slf4j:slf4j-api:2.0.9 -> 2.0.13 +| | | \--- org.slf4j:jul-to-slf4j:2.0.13 +| | | \--- org.slf4j:slf4j-api:2.0.13 +| | +--- jakarta.annotation:jakarta.annotation-api:2.1.1 +| | +--- org.springframework:spring-core:6.1.8 (*) +| | \--- org.yaml:snakeyaml:2.2 +| +--- org.springframework.boot:spring-boot-starter-json:3.3.0 +| | +--- org.springframework.boot:spring-boot-starter:3.3.0 (*) +| | +--- org.springframework:spring-web:6.1.8 +| | | +--- org.springframework:spring-beans:6.1.8 (*) +| | | +--- org.springframework:spring-core:6.1.8 (*) +| | | \--- io.micrometer:micrometer-observation:1.12.6 -> 1.13.0 (*) +| | +--- com.fasterxml.jackson.core:jackson-databind:2.17.1 +| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.17.1 +| | | | \--- com.fasterxml.jackson:jackson-bom:2.17.1 +| | | | +--- com.fasterxml.jackson.core:jackson-annotations:2.17.1 (c) +| | | | +--- com.fasterxml.jackson.core:jackson-core:2.17.1 (c) +| | | | +--- com.fasterxml.jackson.core:jackson-databind:2.17.1 (c) +| | | | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.17.1 (c) +| | | | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1 (c) +| | | | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.17.1 (c) +| | | +--- com.fasterxml.jackson.core:jackson-core:2.17.1 +| | | | \--- com.fasterxml.jackson:jackson-bom:2.17.1 (*) +| | | \--- com.fasterxml.jackson:jackson-bom:2.17.1 (*) +| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.17.1 +| | | +--- com.fasterxml.jackson.core:jackson-core:2.17.1 (*) +| | | +--- com.fasterxml.jackson.core:jackson-databind:2.17.1 (*) +| | | \--- com.fasterxml.jackson:jackson-bom:2.17.1 (*) +| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1 +| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.17.1 (*) +| | | +--- com.fasterxml.jackson.core:jackson-core:2.17.1 (*) +| | | +--- com.fasterxml.jackson.core:jackson-databind:2.17.1 (*) +| | | \--- com.fasterxml.jackson:jackson-bom:2.17.1 (*) +| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.17.1 +| | +--- com.fasterxml.jackson.core:jackson-core:2.17.1 (*) +| | +--- com.fasterxml.jackson.core:jackson-databind:2.17.1 (*) +| | \--- com.fasterxml.jackson:jackson-bom:2.17.1 (*) +| +--- org.springframework.boot:spring-boot-starter-tomcat:3.3.0 +| | +--- jakarta.annotation:jakarta.annotation-api:2.1.1 +| | +--- org.apache.tomcat.embed:tomcat-embed-core:10.1.24 +| | +--- org.apache.tomcat.embed:tomcat-embed-el:10.1.24 +| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:10.1.24 +| | \--- org.apache.tomcat.embed:tomcat-embed-core:10.1.24 +| +--- org.springframework:spring-web:6.1.8 (*) +| \--- org.springframework:spring-webmvc:6.1.8 +| +--- org.springframework:spring-aop:6.1.8 (*) +| +--- org.springframework:spring-beans:6.1.8 (*) +| +--- org.springframework:spring-context:6.1.8 (*) +| +--- org.springframework:spring-core:6.1.8 (*) +| +--- org.springframework:spring-expression:6.1.8 (*) +| \--- org.springframework:spring-web:6.1.8 (*) ++--- org.springframework.boot:spring-boot-starter-validation -> 3.3.0 +| +--- org.springframework.boot:spring-boot-starter:3.3.0 (*) +| +--- org.apache.tomcat.embed:tomcat-embed-el:10.1.24 +| \--- org.hibernate.validator:hibernate-validator:8.0.1.Final +| +--- jakarta.validation:jakarta.validation-api:3.0.2 +| +--- org.jboss.logging:jboss-logging:3.4.3.Final -> 3.5.3.Final +| \--- com.fasterxml:classmate:1.5.1 -> 1.7.0 ++--- org.springframework.boot:spring-boot-starter-data-jpa -> 3.3.0 +| +--- org.springframework.boot:spring-boot-starter-aop:3.3.0 +| | +--- org.springframework.boot:spring-boot-starter:3.3.0 (*) +| | +--- org.springframework:spring-aop:6.1.8 (*) +| | \--- org.aspectj:aspectjweaver:1.9.22 +| +--- org.springframework.boot:spring-boot-starter-jdbc:3.3.0 +| | +--- org.springframework.boot:spring-boot-starter:3.3.0 (*) +| | +--- com.zaxxer:HikariCP:5.1.0 +| | | \--- org.slf4j:slf4j-api:1.7.36 -> 2.0.13 +| | \--- org.springframework:spring-jdbc:6.1.8 +| | +--- org.springframework:spring-beans:6.1.8 (*) +| | +--- org.springframework:spring-core:6.1.8 (*) +| | \--- org.springframework:spring-tx:6.1.8 +| | +--- org.springframework:spring-beans:6.1.8 (*) +| | \--- org.springframework:spring-core:6.1.8 (*) +| +--- org.hibernate.orm:hibernate-core:6.5.2.Final +| | +--- jakarta.persistence:jakarta.persistence-api:3.1.0 +| | +--- jakarta.transaction:jakarta.transaction-api:2.0.1 +| | +--- org.jboss.logging:jboss-logging:3.5.0.Final -> 3.5.3.Final +| | +--- org.hibernate.common:hibernate-commons-annotations:6.0.6.Final +| | +--- io.smallrye:jandex:3.1.2 +| | +--- com.fasterxml:classmate:1.5.1 -> 1.7.0 +| | +--- net.bytebuddy:byte-buddy:1.14.15 -> 1.14.16 +| | +--- jakarta.xml.bind:jakarta.xml.bind-api:4.0.0 -> 4.0.2 +| | | \--- jakarta.activation:jakarta.activation-api:2.1.3 +| | +--- org.glassfish.jaxb:jaxb-runtime:4.0.2 -> 4.0.5 +| | | \--- org.glassfish.jaxb:jaxb-core:4.0.5 +| | | +--- jakarta.xml.bind:jakarta.xml.bind-api:4.0.2 (*) +| | | +--- jakarta.activation:jakarta.activation-api:2.1.3 +| | | +--- org.eclipse.angus:angus-activation:2.0.2 +| | | | \--- jakarta.activation:jakarta.activation-api:2.1.3 +| | | +--- org.glassfish.jaxb:txw2:4.0.5 +| | | \--- com.sun.istack:istack-commons-runtime:4.1.2 +| | +--- jakarta.inject:jakarta.inject-api:2.0.1 +| | \--- org.antlr:antlr4-runtime:4.13.0 +| +--- org.springframework.data:spring-data-jpa:3.3.0 +| | +--- org.springframework.data:spring-data-commons:3.3.0 +| | | +--- org.springframework:spring-core:6.1.7 -> 6.1.8 (*) +| | | +--- org.springframework:spring-beans:6.1.7 -> 6.1.8 (*) +| | | \--- org.slf4j:slf4j-api:2.0.2 -> 2.0.13 +| | +--- org.springframework:spring-orm:6.1.7 -> 6.1.8 +| | | +--- org.springframework:spring-beans:6.1.8 (*) +| | | +--- org.springframework:spring-core:6.1.8 (*) +| | | +--- org.springframework:spring-jdbc:6.1.8 (*) +| | | \--- org.springframework:spring-tx:6.1.8 (*) +| | +--- org.springframework:spring-context:6.1.7 -> 6.1.8 (*) +| | +--- org.springframework:spring-aop:6.1.7 -> 6.1.8 (*) +| | +--- org.springframework:spring-tx:6.1.7 -> 6.1.8 (*) +| | +--- org.springframework:spring-beans:6.1.7 -> 6.1.8 (*) +| | +--- org.springframework:spring-core:6.1.7 -> 6.1.8 (*) +| | +--- org.antlr:antlr4-runtime:4.13.0 +| | +--- jakarta.annotation:jakarta.annotation-api:2.0.0 -> 2.1.1 +| | \--- org.slf4j:slf4j-api:2.0.2 -> 2.0.13 +| \--- org.springframework:spring-aspects:6.1.8 +| \--- org.aspectj:aspectjweaver:1.9.22.1 -> 1.9.22 +\--- com.h2database:h2 -> 2.2.224 + +(c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. +(*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. A web-based, searchable dependency report is available by adding the --scan option. -BUILD SUCCESSFUL in 1s +BUILD SUCCESSFUL in 24s 1 actionable task: 1 executed From bd81ea00c0e36082b6d24e512fbeca7329a8b9b2 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 17:53:36 +0530 Subject: [PATCH 04/23] replacing javax references with jakarta --- .../java/io/reflectoring/validation/Input.java | 12 ++++++------ .../validation/InputWithCustomValidator.java | 16 ++++++++-------- .../io/reflectoring/validation/IpAddress.java | 4 ++-- .../validation/IpAddressValidator.java | 4 ++-- .../ErrorHandlingControllerAdvice.java | 4 ++-- .../parameters/ValidateParametersController.java | 4 ++-- .../ValidateRequestBodyController.java | 2 +- .../ProgrammaticallyValidatingService.java | 10 +++++----- .../validation/service/ValidatingService.java | 2 +- .../service/ValidatingServiceWithGroups.java | 2 +- .../ProgrammaticallyValidatingServiceTest.java | 2 +- .../validation/ValidationApplicationTests.java | 16 ---------------- .../repository/ValidatingRepositoryTest.java | 4 ++-- ...idatingRepositoryWithCustomValidatorTest.java | 4 ++-- .../service/ValidatingServiceTest.java | 2 +- .../service/ValidatingServiceWithGroupsTest.java | 2 +- 16 files changed, 37 insertions(+), 53 deletions(-) delete mode 100644 spring-boot/validation/src/test/java/io/reflectoring/validation/ValidationApplicationTests.java diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index 5ad3250f8..f83f74d9b 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java @@ -1,11 +1,11 @@ package io.reflectoring.validation; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.Pattern; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Pattern; @Entity public class Input { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java index 4036fd5a1..24e96c1ee 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java @@ -1,13 +1,13 @@ package io.reflectoring.validation; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Null; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; import io.reflectoring.validation.service.OnCreate; import io.reflectoring.validation.service.OnUpdate; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java index e05173213..c8e308d69 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java @@ -1,7 +1,7 @@ package io.reflectoring.validation; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java index 02bb2dc92..02feb4f11 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java @@ -1,7 +1,7 @@ package io.reflectoring.validation; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java index 1b0711262..c7c2569fa 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java @@ -1,7 +1,7 @@ package io.reflectoring.validation.controller.controlleradvice; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java index 0fad8afc3..729789e38 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java @@ -1,7 +1,7 @@ package io.reflectoring.validation.controller.parameters; -import javax.validation.ConstraintViolationException; -import javax.validation.constraints.Min; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.constraints.Min; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java index 78fc604ac..95ee7390c 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java @@ -1,6 +1,6 @@ package io.reflectoring.validation.controller.requestbody; -import javax.validation.Valid; +import jakarta.validation.Valid; import io.reflectoring.validation.Input; import org.springframework.http.ResponseEntity; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java index 338f1d9d6..9ff859a98 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java @@ -1,10 +1,10 @@ package io.reflectoring.validation.service; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import java.util.Set; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java index e9180f185..075de761c 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java @@ -1,6 +1,6 @@ package io.reflectoring.validation.service; -import javax.validation.Valid; +import jakarta.validation.Valid; import io.reflectoring.validation.Input; import org.springframework.stereotype.Service; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java index 47199c4f3..8eb8004f7 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java @@ -1,6 +1,6 @@ package io.reflectoring.validation.service; -import javax.validation.Valid; +import jakarta.validation.Valid; import io.reflectoring.validation.InputWithCustomValidator; import org.springframework.stereotype.Service; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java index 1ddd49ef5..c40530fc9 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java @@ -1,6 +1,6 @@ package io.reflectoring.validation; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.service.ProgrammaticallyValidatingService; import org.junit.jupiter.api.Test; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/ValidationApplicationTests.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/ValidationApplicationTests.java deleted file mode 100644 index 35778b8f7..000000000 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/ValidationApplicationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.reflectoring.validation; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class ValidationApplicationTests { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java index 5ae568b76..df202089b 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java @@ -1,7 +1,7 @@ package io.reflectoring.validation.repository; -import javax.persistence.EntityManager; -import javax.validation.ConstraintViolationException; +import jakarta.persistence.EntityManager; +import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.Input; import io.reflectoring.validation.repository.ValidatingRepository; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java index 49b94ce6c..17699d77b 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java @@ -1,7 +1,7 @@ package io.reflectoring.validation.repository; -import javax.persistence.EntityManager; -import javax.validation.ConstraintViolationException; +import jakarta.persistence.EntityManager; +import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.InputWithCustomValidator; import org.junit.jupiter.api.Assertions; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java index 51ba600df..19ebe528c 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java @@ -1,6 +1,6 @@ package io.reflectoring.validation.service; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.Input; import io.reflectoring.validation.service.ValidatingService; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java index 6193e3f02..5a37ef852 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java @@ -1,6 +1,6 @@ package io.reflectoring.validation.service; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.InputWithCustomValidator; import org.junit.jupiter.api.Test; From 9fbeee9f05993b86267e6d6bf62c5800811e2f3d Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 18:22:58 +0530 Subject: [PATCH 05/23] adding lombok --- spring-boot/validation/build.gradle | 2 ++ .../io/reflectoring/validation/Input.java | 19 +++---------- .../validation/InputWithCustomValidator.java | 27 +++---------------- .../io/reflectoring/validation/IpAddress.java | 2 +- .../validation/IpAddressValidator.java | 5 ++-- .../ValidationErrorResponse.java | 12 ++++----- .../controlleradvice/Violation.java | 17 ++++-------- .../ProgrammaticallyValidatingService.java | 2 +- 8 files changed, 25 insertions(+), 61 deletions(-) diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index 62f492577..3d509bb46 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -22,6 +22,8 @@ dependencies { implementation('org.springframework.boot:spring-boot-starter-validation') implementation('org.springframework.boot:spring-boot-starter-data-jpa') runtimeOnly('com.h2database:h2') + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index f83f74d9b..a82166007 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java @@ -6,7 +6,11 @@ import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Pattern; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter @Entity public class Input { @@ -23,19 +27,4 @@ public class Input { @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$") private String ipAddress; - public int getNumberBetweenOneAndTen() { - return numberBetweenOneAndTen; - } - - public void setNumberBetweenOneAndTen(int numberBetweenOneAndTen) { - this.numberBetweenOneAndTen = numberBetweenOneAndTen; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java index 24e96c1ee..b2fc0a2d2 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java @@ -11,7 +11,11 @@ import io.reflectoring.validation.service.OnCreate; import io.reflectoring.validation.service.OnUpdate; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter @Entity public class InputWithCustomValidator { @@ -30,27 +34,4 @@ public class InputWithCustomValidator { @Column private String ipAddress; - public int getNumberBetweenOneAndTen() { - return numberBetweenOneAndTen; - } - - public void setNumberBetweenOneAndTen(int numberBetweenOneAndTen) { - this.numberBetweenOneAndTen = numberBetweenOneAndTen; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java index c8e308d69..bc7437174 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java @@ -7,7 +7,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target({ FIELD }) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java index 02feb4f11..7a1080509 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java @@ -8,16 +8,17 @@ public class IpAddressValidator implements ConstraintValidator { + private final Pattern pattern = Pattern.compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"); + @Override public boolean isValid(String value, ConstraintValidatorContext context) { - Pattern pattern = Pattern.compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"); Matcher matcher = pattern.matcher(value); try { if (!matcher.matches()) { return false; } else { for (int i = 1; i <= 4; i++) { - int octet = Integer.valueOf(matcher.group(i)); + int octet = Integer.parseInt(matcher.group(i)); if (octet > 255) { return false; } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java index ec294ac9c..8e916eb4b 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java @@ -1,17 +1,15 @@ package io.reflectoring.validation.controller.controlleradvice; +import lombok.Getter; +import lombok.Setter; + import java.util.ArrayList; import java.util.List; +@Getter +@Setter public class ValidationErrorResponse { private List violations = new ArrayList<>(); - public List getViolations() { - return violations; - } - - public void setViolations(List violations) { - this.violations = violations; - } } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java index f3446516c..a7d317b5e 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java @@ -1,21 +1,14 @@ package io.reflectoring.validation.controller.controlleradvice; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor public class Violation { private final String fieldName; private final String message; - public Violation(String fieldName, String message) { - this.fieldName = fieldName; - this.message = message; - } - - public String getFieldName() { - return fieldName; - } - - public String getMessage() { - return message; - } } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java index 9ff859a98..d11ede11b 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java @@ -14,7 +14,7 @@ @Service public class ProgrammaticallyValidatingService { - private Validator validator; + private final Validator validator; public ProgrammaticallyValidatingService(Validator validator) { this.validator = validator; From e654690dc7d6b43fa23cb4c9f02e172f0d751e51 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 19:01:50 +0530 Subject: [PATCH 06/23] removing deprecated method calls --- .../requestbody/ValidateRequestBodyControllerTest.java | 3 ++- .../validation/repository/ValidatingRepositoryTest.java | 1 - .../ValidatingRepositoryWithCustomValidatorTest.java | 4 +++- .../validation/service/ValidatingServiceTest.java | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java index 527be8022..2b766d00a 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java @@ -9,7 +9,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import static org.assertj.core.api.Java6Assertions.assertThat; + +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java index df202089b..cb4e629e5 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java @@ -4,7 +4,6 @@ import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.Input; -import io.reflectoring.validation.repository.ValidatingRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java index 17699d77b..43d663578 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java @@ -4,13 +4,15 @@ import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.InputWithCustomValidator; + +import static org.assertj.core.api.Assertions.assertThat; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.assertj.core.api.Java6Assertions.assertThat; @ExtendWith(SpringExtension.class) @DataJpaTest diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java index 19ebe528c..463569ffd 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java @@ -3,7 +3,6 @@ import jakarta.validation.ConstraintViolationException; import io.reflectoring.validation.Input; -import io.reflectoring.validation.service.ValidatingService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; From 9bbebc1f8ab6a167f42056cbc86ae5878eff91c1 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 19:04:02 +0530 Subject: [PATCH 07/23] organizing imports --- .../validation/InputWithCustomValidator.java | 5 ++--- .../java/io/reflectoring/validation/IpAddress.java | 8 ++++---- .../reflectoring/validation/IpAddressValidator.java | 6 +++--- .../ErrorHandlingControllerAdvice.java | 6 +++--- .../controlleradvice/ValidationErrorResponse.java | 6 +++--- .../parameters/ValidateParametersController.java | 6 +++--- .../requestbody/ValidateRequestBodyController.java | 6 +++--- .../validation/repository/ValidatingRepository.java | 3 ++- .../ValidatingRepositoryWithCustomValidator.java | 3 ++- .../service/ProgrammaticallyValidatingService.java | 10 +++++----- .../validation/service/ValidatingService.java | 6 +++--- .../service/ValidatingServiceWithGroups.java | 6 +++--- .../validation/IpAddressValidatorTest.java | 4 +++- .../ProgrammaticallyValidatingServiceTest.java | 7 ++++--- .../parameters/ValidateParametersControllerTest.java | 5 +++-- .../ValidateRequestBodyControllerTest.java | 12 +++++++----- .../repository/ValidatingRepositoryTest.java | 9 +++++---- .../ValidatingRepositoryWithCustomValidatorTest.java | 9 ++++----- .../validation/service/ValidatingServiceTest.java | 7 ++++--- .../service/ValidatingServiceWithGroupsTest.java | 7 ++++--- 20 files changed, 70 insertions(+), 61 deletions(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java index b2fc0a2d2..164e5003d 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/InputWithCustomValidator.java @@ -1,5 +1,7 @@ package io.reflectoring.validation; +import io.reflectoring.validation.service.OnCreate; +import io.reflectoring.validation.service.OnUpdate; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -8,9 +10,6 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; - -import io.reflectoring.validation.service.OnCreate; -import io.reflectoring.validation.service.OnUpdate; import lombok.Getter; import lombok.Setter; diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java index bc7437174..e5273d594 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java @@ -1,14 +1,14 @@ package io.reflectoring.validation; -import jakarta.validation.Constraint; -import jakarta.validation.Payload; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Target({ FIELD }) @Retention(RUNTIME) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java index 7a1080509..01d50cec3 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java @@ -1,11 +1,11 @@ package io.reflectoring.validation; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - import java.util.regex.Matcher; import java.util.regex.Pattern; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + public class IpAddressValidator implements ConstraintValidator { private final Pattern pattern = Pattern.compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"); diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java index c7c2569fa..e34c55e83 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java @@ -1,8 +1,5 @@ package io.reflectoring.validation.controller.controlleradvice; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; - import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -11,6 +8,9 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + @ControllerAdvice class ErrorHandlingControllerAdvice { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java index 8e916eb4b..f78df9aa6 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java @@ -1,11 +1,11 @@ package io.reflectoring.validation.controller.controlleradvice; -import lombok.Getter; -import lombok.Setter; - import java.util.ArrayList; import java.util.List; +import lombok.Getter; +import lombok.Setter; + @Getter @Setter public class ValidationErrorResponse { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java index 729789e38..7c4ba4c7c 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java @@ -1,8 +1,5 @@ package io.reflectoring.validation.controller.parameters; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.constraints.Min; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -14,6 +11,9 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.constraints.Min; + @RestController @Validated class ValidateParametersController { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java index 95ee7390c..fd23b5c3c 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java @@ -1,13 +1,13 @@ package io.reflectoring.validation.controller.requestbody; -import jakarta.validation.Valid; - -import io.reflectoring.validation.Input; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import io.reflectoring.validation.Input; +import jakarta.validation.Valid; + @RestController class ValidateRequestBodyController { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepository.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepository.java index 7031c2cd0..1f7ad903a 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepository.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepository.java @@ -1,7 +1,8 @@ package io.reflectoring.validation.repository; -import io.reflectoring.validation.Input; import org.springframework.data.repository.CrudRepository; +import io.reflectoring.validation.Input; + public interface ValidatingRepository extends CrudRepository { } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidator.java index 363689024..f762a4ce9 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidator.java @@ -1,7 +1,8 @@ package io.reflectoring.validation.repository; -import io.reflectoring.validation.InputWithCustomValidator; import org.springframework.data.repository.CrudRepository; +import io.reflectoring.validation.InputWithCustomValidator; + public interface ValidatingRepositoryWithCustomValidator extends CrudRepository { } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java index d11ede11b..55054dd47 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ProgrammaticallyValidatingService.java @@ -1,16 +1,16 @@ package io.reflectoring.validation.service; +import java.util.Set; + +import org.springframework.stereotype.Service; + +import io.reflectoring.validation.Input; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; -import java.util.Set; - -import io.reflectoring.validation.Input; -import org.springframework.stereotype.Service; - @Service public class ProgrammaticallyValidatingService { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java index 075de761c..064250fdc 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingService.java @@ -1,11 +1,11 @@ package io.reflectoring.validation.service; -import jakarta.validation.Valid; - -import io.reflectoring.validation.Input; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import io.reflectoring.validation.Input; +import jakarta.validation.Valid; + @Service @Validated class ValidatingService { diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java index 8eb8004f7..cc54b5621 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/service/ValidatingServiceWithGroups.java @@ -1,11 +1,11 @@ package io.reflectoring.validation.service; -import jakarta.validation.Valid; - -import io.reflectoring.validation.InputWithCustomValidator; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import io.reflectoring.validation.InputWithCustomValidator; +import jakarta.validation.Valid; + @Service @Validated class ValidatingServiceWithGroups { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java index 498c86b47..10edd0fc3 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java @@ -1,7 +1,9 @@ package io.reflectoring.validation; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; class IpAddressValidatorTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java index c40530fc9..c730e37a0 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java @@ -1,14 +1,15 @@ package io.reflectoring.validation; -import jakarta.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -import io.reflectoring.validation.service.ProgrammaticallyValidatingService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.*; + +import io.reflectoring.validation.service.ProgrammaticallyValidatingService; +import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @SpringBootTest diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java index e75806530..481b77bdf 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java @@ -1,13 +1,14 @@ package io.reflectoring.validation.controller.parameters; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = ValidateParametersController.class) diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java index 2b766d00a..1ca3123f9 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java @@ -1,7 +1,9 @@ package io.reflectoring.validation.controller.requestbody; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.reflectoring.validation.Input; +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -10,9 +12,9 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import com.fasterxml.jackson.databind.ObjectMapper; + +import io.reflectoring.validation.Input; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = ValidateRequestBodyController.class) diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java index cb4e629e5..21ce83c92 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java @@ -1,15 +1,16 @@ package io.reflectoring.validation.repository; -import jakarta.persistence.EntityManager; -import jakarta.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -import io.reflectoring.validation.Input; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.*; + +import io.reflectoring.validation.Input; +import jakarta.persistence.EntityManager; +import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @DataJpaTest diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java index 43d663578..6ec80efc5 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java @@ -1,10 +1,5 @@ package io.reflectoring.validation.repository; -import jakarta.persistence.EntityManager; -import jakarta.validation.ConstraintViolationException; - -import io.reflectoring.validation.InputWithCustomValidator; - import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Assertions; @@ -14,6 +9,10 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.test.context.junit.jupiter.SpringExtension; +import io.reflectoring.validation.InputWithCustomValidator; +import jakarta.persistence.EntityManager; +import jakarta.validation.ConstraintViolationException; + @ExtendWith(SpringExtension.class) @DataJpaTest class ValidatingRepositoryWithCustomValidatorTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java index 463569ffd..f16a1613c 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java @@ -1,14 +1,15 @@ package io.reflectoring.validation.service; -import jakarta.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -import io.reflectoring.validation.Input; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.assertThrows; + +import io.reflectoring.validation.Input; +import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @SpringBootTest diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java index 5a37ef852..deda2f590 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java @@ -1,14 +1,15 @@ package io.reflectoring.validation.service; -import jakarta.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -import io.reflectoring.validation.InputWithCustomValidator; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; -import static org.junit.jupiter.api.Assertions.*; + +import io.reflectoring.validation.InputWithCustomValidator; +import jakarta.validation.ConstraintViolationException; @ExtendWith(SpringExtension.class) @SpringBootTest From d515b1f9e8346c8342a527b9ef023d3f56a79b2f Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 19:09:00 +0530 Subject: [PATCH 08/23] adding lombok plugin --- spring-boot/validation/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index 3d509bb46..bec6ec434 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id "io.freefair.lombok" version "8.6" id 'org.springframework.boot' version '3.3.0' id 'io.spring.dependency-management' version '1.1.5' } From 2bfe148247aef2e772be7fd9d6e9cfd8713e9520 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Sun, 9 Jun 2024 19:10:14 +0530 Subject: [PATCH 09/23] updating .gitignore --- spring-boot/validation/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-boot/validation/.gitignore b/spring-boot/validation/.gitignore index 9243c63d7..8899af5f4 100644 --- a/spring-boot/validation/.gitignore +++ b/spring-boot/validation/.gitignore @@ -10,6 +10,7 @@ .settings .springBeans .sts4-cache +bin/ ### IntelliJ IDEA ### .idea @@ -23,4 +24,4 @@ /nbbuild/ /dist/ /nbdist/ -/.nb-gradle/ \ No newline at end of file +/.nb-gradle/ From 5ba8da7dbd0bc3ddc8be254b37be0ffbb6d8eef0 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 07:37:51 +0530 Subject: [PATCH 10/23] improving readability of validator --- .../io/reflectoring/validation/IpAddress.java | 2 +- .../validation/IpAddressValidator.java | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java index e5273d594..831ddb33d 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java @@ -10,7 +10,7 @@ import jakarta.validation.Constraint; import jakarta.validation.Payload; -@Target({ FIELD }) +@Target(FIELD) @Retention(RUNTIME) @Constraint(validatedBy = IpAddressValidator.class) @Documented diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java index 01d50cec3..a1f2da047 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddressValidator.java @@ -8,26 +8,27 @@ public class IpAddressValidator implements ConstraintValidator { - private final Pattern pattern = Pattern.compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"); + private static final Pattern IP_ADDRESS_PATTERN = Pattern.compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { - Matcher matcher = pattern.matcher(value); - try { - if (!matcher.matches()) { + Matcher matcher = IP_ADDRESS_PATTERN.matcher(value); + boolean isValidIpAddress = matcher.matches(); + + if (isValidIpAddress) { + isValidIpAddress = isValidOctets(matcher); + } + return isValidIpAddress; + } + + private boolean isValidOctets(Matcher matcher) { + for (int i = 1; i <= 4; i++) { + int octet = Integer.parseInt(matcher.group(i)); + if (octet < 0 || octet > 255) { return false; - } else { - for (int i = 1; i <= 4; i++) { - int octet = Integer.parseInt(matcher.group(i)); - if (octet > 255) { - return false; - } - } - return true; } - } catch (Exception e) { - return false; } + return true; } } From 1dddc301b75b3ac9f33e5f77d251ad1a4fc5b556 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 09:05:26 +0530 Subject: [PATCH 11/23] updating exception handling --- .../ErrorHandlingControllerAdvice.java | 39 +++++++++++-------- .../ValidationErrorResponse.java | 15 ------- .../ValidateParametersController.java | 10 ++--- .../ValidateParametersControllerTest.java | 8 +++- 4 files changed, 33 insertions(+), 39 deletions(-) delete mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java index e34c55e83..1fe725d0d 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java @@ -1,39 +1,44 @@ package io.reflectoring.validation.controller.controlleradvice; +import java.util.ArrayList; +import java.util.List; + import org.springframework.http.HttpStatus; +import org.springframework.http.ProblemDetail; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; @ControllerAdvice class ErrorHandlingControllerAdvice { + + private static final String VIOLATIONS_KEY = "violations"; @ExceptionHandler(ConstraintViolationException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ResponseBody - ValidationErrorResponse onConstraintValidationException(ConstraintViolationException e) { - ValidationErrorResponse error = new ValidationErrorResponse(); - for (ConstraintViolation violation : e.getConstraintViolations()) { - error.getViolations().add(new Violation(violation.getPropertyPath().toString(), violation.getMessage())); + ProblemDetail handle(ConstraintViolationException exception) { + List < Violation > violations = new ArrayList < > (); + for (ConstraintViolation violation: exception.getConstraintViolations()) { + violations.add(new Violation(violation.getPropertyPath().toString(), violation.getMessage())); } - return error; + + ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "Validation failure."); + problemDetail.setProperty(VIOLATIONS_KEY, violations); + return problemDetail; } @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ResponseBody - ValidationErrorResponse onMethodArgumentNotValidException(MethodArgumentNotValidException e) { - ValidationErrorResponse error = new ValidationErrorResponse(); - for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { - error.getViolations().add(new Violation(fieldError.getField(), fieldError.getDefaultMessage())); + ProblemDetail handle(MethodArgumentNotValidException exception) { + List < Violation > violations = new ArrayList < > (); + for (FieldError fieldError: exception.getBindingResult().getFieldErrors()) { + violations.add(new Violation(fieldError.getField(), fieldError.getDefaultMessage())); } - return error; + ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "Validation failure."); + problemDetail.setProperty(VIOLATIONS_KEY, violations); + return problemDetail; } -} +} \ No newline at end of file diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java deleted file mode 100644 index f78df9aa6..000000000 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.reflectoring.validation.controller.controlleradvice; - -import java.util.ArrayList; -import java.util.List; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class ValidationErrorResponse { - - private List violations = new ArrayList<>(); - -} diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java index 7c4ba4c7c..73fa9fa6b 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java @@ -1,6 +1,7 @@ package io.reflectoring.validation.controller.parameters; import org.springframework.http.HttpStatus; +import org.springframework.http.ProblemDetail; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -8,7 +9,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import jakarta.validation.ConstraintViolationException; @@ -28,11 +28,11 @@ ResponseEntity validateRequestParameter(@RequestParam("param") @Min(5) i return ResponseEntity.ok("valid"); } - @ExceptionHandler(ConstraintViolationException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody - String handleConstraintViolationException(ConstraintViolationException e) { - return "not valid due to validation error: " + e.getMessage(); + @ExceptionHandler(ConstraintViolationException.class) + ProblemDetail handle(ConstraintViolationException exception) { + String detail = "Validation error: " + exception.getMessage(); + return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, detail); } diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java index 481b77bdf..c1953db13 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java @@ -1,7 +1,9 @@ package io.reflectoring.validation.controller.parameters; +import static org.hamcrest.CoreMatchers.startsWith; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -20,14 +22,16 @@ class ValidateParametersControllerTest { @Test void whenPathVariableIsInvalid_thenReturnsStatus400() throws Exception { mvc.perform(get("/validatePathVariable/3")) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @Test void whenRequestParameterIsInvalid_thenReturnsStatus400() throws Exception { mvc.perform(get("/validateRequestParameter") .param("param", "3")) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @Test From 4e83b25a135c115c76bcdacf45d19d7795dd5068 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 09:38:49 +0530 Subject: [PATCH 12/23] removing SpringExtension in tests --- .../validation/IpAddressValidatorTest.java | 11 +++++++++-- .../ProgrammaticallyValidatingServiceTest.java | 3 --- .../ValidateParametersControllerTest.java | 16 +++++++++------- .../ValidateRequestBodyControllerTest.java | 13 +++++++------ .../repository/ValidatingRepositoryTest.java | 3 --- ...idatingRepositoryWithCustomValidatorTest.java | 3 --- .../service/ValidatingServiceTest.java | 3 --- .../service/ValidatingServiceWithGroupsTest.java | 3 --- 8 files changed, 25 insertions(+), 30 deletions(-) diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java index 10edd0fc3..9f0cdfdc5 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/IpAddressValidatorTest.java @@ -7,10 +7,17 @@ class IpAddressValidatorTest { + private final IpAddressValidator validator = new IpAddressValidator(); + @Test - void test(){ - IpAddressValidator validator = new IpAddressValidator(); + void whenValidIpAddress_thenValidationSucceeds() { assertTrue(validator.isValid("111.111.111.111", null)); + assertTrue(validator.isValid("0.0.0.0", null)); + assertTrue(validator.isValid("255.255.255.255", null)); + } + + @Test + void whenInvalidIpAddress_thenValidationFails() { assertFalse(validator.isValid("111.foo.111.111", null)); assertFalse(validator.isValid("111.111.256.111", null)); } diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java index c730e37a0..1827e53d2 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammaticallyValidatingServiceTest.java @@ -3,15 +3,12 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import io.reflectoring.validation.service.ProgrammaticallyValidatingService; import jakarta.validation.ConstraintViolationException; -@ExtendWith(SpringExtension.class) @SpringBootTest class ProgrammaticallyValidatingServiceTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java index c1953db13..10f1d88ad 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java @@ -2,17 +2,16 @@ import static org.hamcrest.CoreMatchers.startsWith; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; -@ExtendWith(SpringExtension.class) +import lombok.SneakyThrows; + @WebMvcTest(controllers = ValidateParametersController.class) class ValidateParametersControllerTest { @@ -20,14 +19,16 @@ class ValidateParametersControllerTest { private MockMvc mvc; @Test - void whenPathVariableIsInvalid_thenReturnsStatus400() throws Exception { + @SneakyThrows + void whenPathVariableIsInvalid_thenReturnsStatus400() { mvc.perform(get("/validatePathVariable/3")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @Test - void whenRequestParameterIsInvalid_thenReturnsStatus400() throws Exception { + @SneakyThrows + void whenRequestParameterIsInvalid_thenReturnsStatus400() { mvc.perform(get("/validateRequestParameter") .param("param", "3")) .andExpect(status().isBadRequest()) @@ -35,7 +36,8 @@ void whenRequestParameterIsInvalid_thenReturnsStatus400() throws Exception { } @Test - void whenPathVariableIsValid_thenReturnsStatus200() throws Exception { + @SneakyThrows + void whenPathVariableIsValid_thenReturnsStatus200() { mvc.perform(get("/validatePathVariable/10")) .andExpect(status().isOk()); } diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java index 1ca3123f9..438d76209 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java @@ -5,18 +5,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import com.fasterxml.jackson.databind.ObjectMapper; import io.reflectoring.validation.Input; +import lombok.SneakyThrows; -@ExtendWith(SpringExtension.class) @WebMvcTest(controllers = ValidateRequestBodyController.class) class ValidateRequestBodyControllerTest { @@ -27,7 +25,8 @@ class ValidateRequestBodyControllerTest { private ObjectMapper objectMapper; @Test - void whenInputIsInvalid_thenReturnsStatus400() throws Exception { + @SneakyThrows + void whenInputIsInvalid_thenReturnsStatus400() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); @@ -45,7 +44,8 @@ private Input invalidInput() { } @Test - void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() throws Exception { + @SneakyThrows + void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); @@ -59,7 +59,8 @@ void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() throws Exception { } @Test - void whenInputIsValid_thenReturnsStatus200() throws Exception { + @SneakyThrows + void whenInputIsValid_thenReturnsStatus200() { Input input = validInput(); String body = objectMapper.writeValueAsString(input); diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java index 21ce83c92..41c37a6ba 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryTest.java @@ -3,16 +3,13 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import io.reflectoring.validation.Input; import jakarta.persistence.EntityManager; import jakarta.validation.ConstraintViolationException; -@ExtendWith(SpringExtension.class) @DataJpaTest class ValidatingRepositoryTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java index 6ec80efc5..16376403b 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/repository/ValidatingRepositoryWithCustomValidatorTest.java @@ -4,16 +4,13 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import io.reflectoring.validation.InputWithCustomValidator; import jakarta.persistence.EntityManager; import jakarta.validation.ConstraintViolationException; -@ExtendWith(SpringExtension.class) @DataJpaTest class ValidatingRepositoryWithCustomValidatorTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java index f16a1613c..78a21ffc4 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceTest.java @@ -3,15 +3,12 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import io.reflectoring.validation.Input; import jakarta.validation.ConstraintViolationException; -@ExtendWith(SpringExtension.class) @SpringBootTest class ValidatingServiceTest { diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java index deda2f590..732b8a837 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/service/ValidatingServiceWithGroupsTest.java @@ -3,15 +3,12 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; import io.reflectoring.validation.InputWithCustomValidator; import jakarta.validation.ConstraintViolationException; -@ExtendWith(SpringExtension.class) @SpringBootTest class ValidatingServiceWithGroupsTest { From 747acbb190119afffd89714d53b8bfba5a38e8fd Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 09:40:38 +0530 Subject: [PATCH 13/23] fix: code smell --- .../controlleradvice/ErrorHandlingControllerAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java index 1fe725d0d..2e18ccb27 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ErrorHandlingControllerAdvice.java @@ -21,7 +21,7 @@ class ErrorHandlingControllerAdvice { @ExceptionHandler(ConstraintViolationException.class) ProblemDetail handle(ConstraintViolationException exception) { List < Violation > violations = new ArrayList < > (); - for (ConstraintViolation violation: exception.getConstraintViolations()) { + for (ConstraintViolation violation: exception.getConstraintViolations()) { violations.add(new Violation(violation.getPropertyPath().toString(), violation.getMessage())); } From b7cf80508f1d238deb5891db8e49bfbdc438c539 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 09:55:23 +0530 Subject: [PATCH 14/23] using kebab case for API endpoints --- .../parameters/ValidateParametersController.java | 12 ++++++------ .../requestbody/ValidateRequestBodyController.java | 6 +++--- .../ValidateParametersControllerTest.java | 14 +++++++++++--- .../ValidateRequestBodyControllerTest.java | 6 +++--- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java index 73fa9fa6b..824dd8bff 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/parameters/ValidateParametersController.java @@ -18,14 +18,14 @@ @Validated class ValidateParametersController { - @GetMapping("/validatePathVariable/{id}") - ResponseEntity validatePathVariable(@PathVariable("id") @Min(5) int id) { - return ResponseEntity.ok("valid"); + @GetMapping("/validate-path-variable/{id}") + ResponseEntity validatePathVariable(@PathVariable("id") @Min(5) int id) { + return ResponseEntity.ok().build(); } - @GetMapping("/validateRequestParameter") - ResponseEntity validateRequestParameter(@RequestParam("param") @Min(5) int param) { - return ResponseEntity.ok("valid"); + @GetMapping("/validate-request-parameter") + ResponseEntity validateRequestParameter(@RequestParam("param") @Min(5) int param) { + return ResponseEntity.ok().build(); } @ResponseBody diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java index fd23b5c3c..8b6e01bf2 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyController.java @@ -11,9 +11,9 @@ @RestController class ValidateRequestBodyController { - @PostMapping("/validateBody") - ResponseEntity validateBody(@Valid @RequestBody Input input) { - return ResponseEntity.ok("valid"); + @PostMapping("/validate-request-body") + ResponseEntity validateBody(@Valid @RequestBody Input input) { + return ResponseEntity.ok().build(); } } diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java index 10f1d88ad..02baeb1bf 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java @@ -21,7 +21,7 @@ class ValidateParametersControllerTest { @Test @SneakyThrows void whenPathVariableIsInvalid_thenReturnsStatus400() { - mvc.perform(get("/validatePathVariable/3")) + mvc.perform(get("/validate-path-variable/3")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @@ -29,7 +29,7 @@ void whenPathVariableIsInvalid_thenReturnsStatus400() { @Test @SneakyThrows void whenRequestParameterIsInvalid_thenReturnsStatus400() { - mvc.perform(get("/validateRequestParameter") + mvc.perform(get("/validate-request-parameter") .param("param", "3")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); @@ -38,7 +38,15 @@ void whenRequestParameterIsInvalid_thenReturnsStatus400() { @Test @SneakyThrows void whenPathVariableIsValid_thenReturnsStatus200() { - mvc.perform(get("/validatePathVariable/10")) + mvc.perform(get("/validate-path-variable/10")) + .andExpect(status().isOk()); + } + + @Test + @SneakyThrows + void whenRequestParameterIsValid_thenReturnsStatus200() { + mvc.perform(get("/validate-request-parameter") + .param("param", "10")) .andExpect(status().isOk()); } diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java index 438d76209..745daf1bc 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/requestbody/ValidateRequestBodyControllerTest.java @@ -30,7 +30,7 @@ void whenInputIsInvalid_thenReturnsStatus400() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); - mvc.perform(post("/validateBody") + mvc.perform(post("/validate-request-body") .contentType("application/json") .content(body)) .andExpect(status().isBadRequest()); @@ -49,7 +49,7 @@ void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); - MvcResult result = mvc.perform(post("/validateBody") + MvcResult result = mvc.perform(post("/validate-request-body") .contentType("application/json") .content(body)) .andExpect(status().isBadRequest()) @@ -64,7 +64,7 @@ void whenInputIsValid_thenReturnsStatus200() { Input input = validInput(); String body = objectMapper.writeValueAsString(input); - mvc.perform(post("/validateBody") + mvc.perform(post("/validate-request-body") .contentType("application/json") .content(body)) .andExpect(status().isOk()); From 06688c31f3f940c851346dcb3941def034461818 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 12:12:22 +0530 Subject: [PATCH 15/23] externalizing error messages --- .../io/reflectoring/validation/Input.java | 3 ++- .../validation/ValidationApplication.java | 19 +++++++++++++++---- .../resources/ValidationMessages.properties | 1 - .../src/main/resources/application.properties | 1 + .../resources/validation-errors.properties | 1 + 5 files changed, 19 insertions(+), 6 deletions(-) delete mode 100644 spring-boot/validation/src/main/resources/ValidationMessages.properties create mode 100644 spring-boot/validation/src/main/resources/application.properties create mode 100644 spring-boot/validation/src/main/resources/validation-errors.properties diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index a82166007..60f8e803c 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java @@ -24,7 +24,8 @@ public class Input { // Note that this is actually not a valid IP address pattern, since // it allows values greater than 255 per octet. - @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$") + // @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$") + @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$", message = "{ip-address.invalid}") private String ipAddress; } diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java index 955d68e56..209a1415a 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java @@ -2,11 +2,22 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; @SpringBootApplication public class ValidationApplication { - public static void main(String[] args) { - SpringApplication.run(ValidationApplication.class, args); - } -} + public static void main(String[] args) { + SpringApplication.run(ValidationApplication.class, args); + } + + @Bean + public MessageSource messageSource() { + ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + messageSource.setBasename("classpath:validation-errors"); + return messageSource; + } + +} \ No newline at end of file diff --git a/spring-boot/validation/src/main/resources/ValidationMessages.properties b/spring-boot/validation/src/main/resources/ValidationMessages.properties deleted file mode 100644 index 93501ea76..000000000 --- a/spring-boot/validation/src/main/resources/ValidationMessages.properties +++ /dev/null @@ -1 +0,0 @@ -IpAddress.invalid=Invalid IP Address: "${validatedValue}"! \ No newline at end of file diff --git a/spring-boot/validation/src/main/resources/application.properties b/spring-boot/validation/src/main/resources/application.properties new file mode 100644 index 000000000..1736bb20f --- /dev/null +++ b/spring-boot/validation/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.messages.basename=validation-errors \ No newline at end of file diff --git a/spring-boot/validation/src/main/resources/validation-errors.properties b/spring-boot/validation/src/main/resources/validation-errors.properties new file mode 100644 index 000000000..2ca39dbc1 --- /dev/null +++ b/spring-boot/validation/src/main/resources/validation-errors.properties @@ -0,0 +1 @@ +ip-address.invalid=Invalid IP address: '${validatedValue}' \ No newline at end of file From 5bb4945728bac171339941a1255e6179bb4a3dee Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 12:55:01 +0530 Subject: [PATCH 16/23] updating input --- .../src/main/java/io/reflectoring/validation/Input.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index 60f8e803c..4d15bf530 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java @@ -24,7 +24,6 @@ public class Input { // Note that this is actually not a valid IP address pattern, since // it allows values greater than 255 per octet. - // @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$") @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$", message = "{ip-address.invalid}") private String ipAddress; From 717ac53511d8675d175df32c803cf34ebf15b4f9 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 13:06:45 +0530 Subject: [PATCH 17/23] adding configuration properties example --- spring-boot/validation/build.gradle | 1 + .../RequiredConfigurationProperties.java | 25 +++++++++++++++++++ .../validation/ValidationApplication.java | 2 ++ .../src/main/resources/application.properties | 5 +++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/RequiredConfigurationProperties.java diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index bec6ec434..1568990d8 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -22,6 +22,7 @@ dependencies { implementation('org.springframework.boot:spring-boot-starter-web') implementation('org.springframework.boot:spring-boot-starter-validation') implementation('org.springframework.boot:spring-boot-starter-data-jpa') + implementation('org.springframework.boot:spring-boot-configuration-processor') runtimeOnly('com.h2database:h2') compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/RequiredConfigurationProperties.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/RequiredConfigurationProperties.java new file mode 100644 index 000000000..23136eaa0 --- /dev/null +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/RequiredConfigurationProperties.java @@ -0,0 +1,25 @@ +package io.reflectoring.validation; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Validated +@ConfigurationProperties(prefix = "io.reflectoring.jwt") +public class RequiredConfigurationProperties { + + @NotBlank + private String privateKey; + + @NotNull + @Positive + private Integer validityMinutes; + +} \ No newline at end of file diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java index 209a1415a..c85612f49 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java @@ -2,11 +2,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ReloadableResourceBundleMessageSource; @SpringBootApplication +@EnableConfigurationProperties(RequiredConfigurationProperties.class) public class ValidationApplication { public static void main(String[] args) { diff --git a/spring-boot/validation/src/main/resources/application.properties b/spring-boot/validation/src/main/resources/application.properties index 1736bb20f..3e7fb0eb5 100644 --- a/spring-boot/validation/src/main/resources/application.properties +++ b/spring-boot/validation/src/main/resources/application.properties @@ -1 +1,4 @@ -spring.messages.basename=validation-errors \ No newline at end of file +spring.messages.basename=validation-errors + +io.reflectoring.jwt.private-key=test +io.reflectoring.jwt.validity-minutes=10 \ No newline at end of file From d7459fd8217dfdac47542897c9fef7ae81b59b95 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 13:59:44 +0530 Subject: [PATCH 18/23] adding cross field validation example --- .../ProgrammerRegisterationRequest.java | 18 +++++++ .../validation/ProgrammerStereotype.java | 25 +++++++++ .../ProgrammerStereotypeValidator.java | 22 ++++++++ .../ProgrammerSteriotypeValidationTest.java | 53 +++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerRegisterationRequest.java create mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java create mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotypeValidator.java create mode 100644 spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammerSteriotypeValidationTest.java diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerRegisterationRequest.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerRegisterationRequest.java new file mode 100644 index 000000000..9c14df19d --- /dev/null +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerRegisterationRequest.java @@ -0,0 +1,18 @@ +package io.reflectoring.validation; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@ProgrammerStereotype +public class ProgrammerRegisterationRequest { + + @NotBlank + private String programmingLanguage; + + @NotBlank + private String favoriteIDE; + +} \ No newline at end of file diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java new file mode 100644 index 000000000..8fa00883e --- /dev/null +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java @@ -0,0 +1,25 @@ +package io.reflectoring.validation; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +@Documented +@Target(TYPE) +@Retention(RUNTIME) +@Constraint(validatedBy = ProgrammerStereotypeValidator.class) +public @interface ProgrammerStereotype { + + String message() default "Stereotype violation detected! IDE and language not vibing."; + + Class[] groups() default { }; + + Class[] payload() default { }; + +} diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotypeValidator.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotypeValidator.java new file mode 100644 index 000000000..556a9095b --- /dev/null +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotypeValidator.java @@ -0,0 +1,22 @@ +package io.reflectoring.validation; + +import java.util.List; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +public class ProgrammerStereotypeValidator implements ConstraintValidator < ProgrammerStereotype, ProgrammerRegisterationRequest > { + + private static final List UNWORTHY_JAVA_IDES = List.of("Notepad", "Netbeans"); + + @Override + public boolean isValid(ProgrammerRegisterationRequest request, ConstraintValidatorContext context) { + if (request.getProgrammingLanguage().equalsIgnoreCase("Java")) { + if (UNWORTHY_JAVA_IDES.contains(request.getFavoriteIDE())) { + return false; + } + } + return true; + } + +} \ No newline at end of file diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammerSteriotypeValidationTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammerSteriotypeValidationTest.java new file mode 100644 index 000000000..01bfdc7b7 --- /dev/null +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/ProgrammerSteriotypeValidationTest.java @@ -0,0 +1,53 @@ +package io.reflectoring.validation; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; + +class ProgrammerSteriotypeValidationTest { + + private Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + + @Test + void whenJavaProgrammerUsesNotepad_thenValidationFails() { + ProgrammerRegisterationRequest request = new ProgrammerRegisterationRequest(); + request.setProgrammingLanguage("Java"); + request.setFavoriteIDE("Notepad"); + + var violations = validator.validate(request); + + assertFalse(violations.isEmpty()); + assertThat(violations) + .extracting(ConstraintViolation::getMessage) + .contains("Stereotype violation detected! IDE and language not vibing."); + } + + @Test + void whenJavaProgrammerUsesIntelliJ_thenValidationSucceeds() { + ProgrammerRegisterationRequest request = new ProgrammerRegisterationRequest(); + request.setProgrammingLanguage("Java"); + request.setFavoriteIDE("IntelliJ"); + + var violations = validator.validate(request); + + assertTrue(violations.isEmpty()); + } + + @Test + void whenNonJavaProgrammer_thenValidationSucceeds() { + ProgrammerRegisterationRequest request = new ProgrammerRegisterationRequest(); + request.setProgrammingLanguage("Javascript"); + request.setFavoriteIDE("VS Code"); + + var violations = validator.validate(request); + + assertTrue(violations.isEmpty()); + } + +} \ No newline at end of file From 404ccc20dfe8ac0fd8a500dd14e6c8b25e52dcb9 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 17:47:04 +0530 Subject: [PATCH 19/23] fix: error message key --- .../src/main/java/io/reflectoring/validation/IpAddress.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java index 831ddb33d..0e74eda92 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/IpAddress.java @@ -16,7 +16,7 @@ @Documented public @interface IpAddress { - String message() default "{IpAddress.invalid}"; + String message() default "{ip-address.invalid}"; Class[] groups() default { }; From 3d02f9cfa2376cf3750c438179af75dc5bcb39ec Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 18:35:33 +0530 Subject: [PATCH 20/23] updating message source method --- .../java/io/reflectoring/validation/ValidationApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java index c85612f49..de75a9a2f 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ValidationApplication.java @@ -18,7 +18,7 @@ public static void main(String[] args) { @Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); - messageSource.setBasename("classpath:validation-errors"); + messageSource.setBasenames("classpath:validation-errors"); return messageSource; } From 4351f4220cb35ffb16e90419f612da4a4c16a4b1 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 19:16:45 +0530 Subject: [PATCH 21/23] adding custom error message for numeric --- .../src/main/java/io/reflectoring/validation/Input.java | 4 ++-- .../src/main/resources/validation-errors.properties | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index 4d15bf530..5c001f123 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java @@ -18,8 +18,8 @@ public class Input { @GeneratedValue private Long id; - @Min(1) - @Max(10) + @Min(value = 1, message = "{number.invalid}") + @Max(value = 10, message = "{number.invalid}") private int numberBetweenOneAndTen; // Note that this is actually not a valid IP address pattern, since diff --git a/spring-boot/validation/src/main/resources/validation-errors.properties b/spring-boot/validation/src/main/resources/validation-errors.properties index 2ca39dbc1..09a0674ac 100644 --- a/spring-boot/validation/src/main/resources/validation-errors.properties +++ b/spring-boot/validation/src/main/resources/validation-errors.properties @@ -1 +1,2 @@ -ip-address.invalid=Invalid IP address: '${validatedValue}' \ No newline at end of file +ip-address.invalid=Invalid IP address: '${validatedValue}' +number.invalid=The provided number '${validatedValue}' must be between ${min} and ${max} \ No newline at end of file From f6177d7b14e3e538ccab6f77a6ff9dd81f300d35 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 20:16:09 +0530 Subject: [PATCH 22/23] adding additional assertions --- .../parameters/ValidateParametersControllerTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java index 02baeb1bf..e2d66cf2d 100644 --- a/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java +++ b/spring-boot/validation/src/test/java/io/reflectoring/validation/controller/parameters/ValidateParametersControllerTest.java @@ -21,17 +21,23 @@ class ValidateParametersControllerTest { @Test @SneakyThrows void whenPathVariableIsInvalid_thenReturnsStatus400() { - mvc.perform(get("/validate-path-variable/3")) + String apiPath = "/validate-path-variable/3"; + mvc.perform(get(apiPath)) .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.status").value(400)) + .andExpect(jsonPath("$.instance").value(apiPath)) .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @Test @SneakyThrows void whenRequestParameterIsInvalid_thenReturnsStatus400() { - mvc.perform(get("/validate-request-parameter") + String apiPath = "/validate-request-parameter"; + mvc.perform(get(apiPath) .param("param", "3")) .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.status").value(400)) + .andExpect(jsonPath("$.instance").value(apiPath)) .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } From 5d89c4500abbe7e8bdfe4caf0e39aea07b62663a Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl Date: Mon, 10 Jun 2024 20:16:21 +0530 Subject: [PATCH 23/23] updating Violation POJO --- .../validation/controller/controlleradvice/Violation.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java index a7d317b5e..e43a7687f 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/Violation.java @@ -1,14 +1,14 @@ package io.reflectoring.validation.controller.controlleradvice; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; @Getter -@RequiredArgsConstructor +@AllArgsConstructor public class Violation { - private final String fieldName; + private String fieldName; - private final String message; + private String message; }