From c48e17cedf3b47c6822bdd8c54a7a7011ab01e6a Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:00:06 +0530 Subject: [PATCH 1/7] upgrade to gradle 8.8 --- spring-boot/validation/.gitignore | 3 +- spring-boot/validation/build.gradle | 46 +- spring-boot/validation/deps.txt | 872 +++--------------- .../gradle/wrapper/gradle-wrapper.jar | Bin 54711 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 +- 5 files changed, 168 insertions(+), 758 deletions(-) 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/ diff --git a/spring-boot/validation/build.gradle b/spring-boot/validation/build.gradle index ed9da0c53..b83d3d7d8 100644 --- a/spring-boot/validation/build.gradle +++ b/spring-boot/validation/build.gradle @@ -1,42 +1,34 @@ -buildscript { - ext { - springBootVersion = '2.3.1.RELEASE' - } - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - } +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' } -apply plugin: 'java' -apply plugin: 'eclipse' -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' + +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') + implementation('org.springframework.boot:spring-boot-configuration-processor') runtimeOnly('com.h2database:h2') + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' 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 +} diff --git a/spring-boot/validation/deps.txt b/spring-boot/validation/deps.txt index 7a9158da4..ec127f190 100644 --- a/spring-boot/validation/deps.txt +++ b/spring-boot/validation/deps.txt @@ -1,735 +1,151 @@ - > 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) - -A web-based, searchable dependency report is available by adding the --scan option. - -BUILD SUCCESSFUL in 1s ++--- 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. + +BUILD SUCCESSFUL in 24s 1 actionable task: 1 executed 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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 UfUyy3EX0IC28@JalTrWuAK7&_a{vGU literal 54711 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 diff --git a/spring-boot/validation/gradle/wrapper/gradle-wrapper.properties b/spring-boot/validation/gradle/wrapper/gradle-wrapper.properties index 7cd82e999..a4413138c 100644 --- a/spring-boot/validation/gradle/wrapper/gradle-wrapper.properties +++ b/spring-boot/validation/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Tue Feb 06 12:27:20 CET 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip From 6ab9988bb1babd260085f4935f3703be8e517553 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:04:01 +0530 Subject: [PATCH 2/7] replacing javax references with jakarta --- .../java/io/reflectoring/validation/Input.java | 12 ++++++------ .../validation/InputWithCustomValidator.java | 17 ++++++++--------- .../io/reflectoring/validation/IpAddress.java | 8 ++++---- .../validation/IpAddressValidator.java | 6 +++--- .../ErrorHandlingControllerAdvice.java | 8 ++++---- .../ValidateParametersController.java | 6 +++--- .../ValidateRequestBodyController.java | 6 +++--- .../repository/ValidatingRepository.java | 3 ++- ...ValidatingRepositoryWithCustomValidator.java | 3 ++- .../ProgrammaticallyValidatingService.java | 14 +++++++------- .../validation/service/ValidatingService.java | 6 +++--- .../service/ValidatingServiceWithGroups.java | 6 +++--- .../validation/IpAddressValidatorTest.java | 4 +++- .../ProgrammaticallyValidatingServiceTest.java | 7 ++++--- .../validation/ValidationApplicationTests.java | 16 ---------------- .../ValidateParametersControllerTest.java | 5 +++-- .../ValidateRequestBodyControllerTest.java | 13 ++++++++----- .../repository/ValidatingRepositoryTest.java | 10 +++++----- ...datingRepositoryWithCustomValidatorTest.java | 9 +++++---- .../service/ValidatingServiceTest.java | 8 ++++---- .../ValidatingServiceWithGroupsTest.java | 7 ++++--- 21 files changed, 84 insertions(+), 90 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..48cb9cde5 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,16 +1,15 @@ 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 io.reflectoring.validation.service.OnCreate; import io.reflectoring.validation.service.OnUpdate; +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; @Entity public class InputWithCustomValidator { 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..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 javax.validation.Constraint; -import javax.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.*; -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 02bb2dc92..5d02d02d8 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 javax.validation.ConstraintValidator; -import javax.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<IpAddress, String> { @Override 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..d23669dd3 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 javax.validation.ConstraintViolation; -import javax.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 { @@ -19,7 +19,7 @@ class ErrorHandlingControllerAdvice { @ResponseBody ValidationErrorResponse onConstraintValidationException(ConstraintViolationException e) { ValidationErrorResponse error = new ValidationErrorResponse(); - for (ConstraintViolation violation : e.getConstraintViolations()) { + for (ConstraintViolation<?> violation : e.getConstraintViolations()) { error.getViolations().add(new Violation(violation.getPropertyPath().toString(), violation.getMessage())); } return error; 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..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 javax.validation.ConstraintViolationException; -import javax.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 78fc604ac..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 javax.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<Input, Long> { } 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<InputWithCustomValidator, Long> { } 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..af6bba5a8 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 javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - import java.util.Set; -import io.reflectoring.validation.Input; 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; + @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 e9180f185..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 javax.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 47199c4f3..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 javax.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 1ddd49ef5..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 javax.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/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/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 527be8022..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; @@ -9,9 +11,10 @@ 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.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 5ae568b76..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,16 +1,16 @@ package io.reflectoring.validation.repository; -import javax.persistence.EntityManager; -import javax.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -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; 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 49b94ce6c..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,16 +1,17 @@ package io.reflectoring.validation.repository; -import javax.persistence.EntityManager; -import javax.validation.ConstraintViolationException; +import static org.assertj.core.api.Assertions.assertThat; -import io.reflectoring.validation.InputWithCustomValidator; 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; + +import io.reflectoring.validation.InputWithCustomValidator; +import jakarta.persistence.EntityManager; +import jakarta.validation.ConstraintViolationException; @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 51ba600df..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,15 +1,15 @@ package io.reflectoring.validation.service; -import javax.validation.ConstraintViolationException; +import static org.junit.jupiter.api.Assertions.assertThrows; -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; 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 6193e3f02..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 javax.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 4e0c8ba5a953a6349d148e0521e123351fd5e251 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:11:06 +0530 Subject: [PATCH 3/7] section codebase: Validating Properties at Startup --- .../RequiredConfigurationProperties.java | 25 +++++++++++++++++++ .../validation/ValidationApplication.java | 2 ++ .../src/main/resources/application.properties | 2 ++ 3 files changed, 29 insertions(+) create mode 100644 spring-boot/validation/src/main/java/io/reflectoring/validation/RequiredConfigurationProperties.java create mode 100644 spring-boot/validation/src/main/resources/application.properties 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 955d68e56..36100eb28 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,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; @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 new file mode 100644 index 000000000..288cdb1b2 --- /dev/null +++ b/spring-boot/validation/src/main/resources/application.properties @@ -0,0 +1,2 @@ +io.reflectoring.jwt.private-key=test +io.reflectoring.jwt.validity-minutes=10 \ No newline at end of file From 94ef893d5e9c6ac8a4c51d32f565fb044d89a398 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:13:21 +0530 Subject: [PATCH 4/7] section codebase: Implementing Cross-Field Validation --- .../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..7503d5bd4 --- /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<? extends Payload>[] payload() default { }; + +} \ No newline at end of file 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 <String> 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 efc57430926912ef221db4586e27a00e2ca027c2 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:26:42 +0530 Subject: [PATCH 5/7] section codebase: Loading Error Messages from a Properties File --- .../io/reflectoring/validation/Input.java | 6 +++--- .../io/reflectoring/validation/IpAddress.java | 2 +- .../validation/ValidationApplication.java | 19 +++++++++++++++---- .../resources/ValidationMessages.properties | 1 - .../src/main/resources/application.properties | 4 +++- .../resources/validation-errors.properties | 2 ++ 6 files changed, 24 insertions(+), 10 deletions(-) delete mode 100644 spring-boot/validation/src/main/resources/ValidationMessages.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 f83f74d9b..2ef3e9339 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 @@ -14,13 +14,13 @@ 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 // 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; public int getNumberBetweenOneAndTen() { 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..149d73e21 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 { }; 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 36100eb28..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 @@ -3,12 +3,23 @@ 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) { - 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.setBasenames("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 index 288cdb1b2..5c8e81353 100644 --- a/spring-boot/validation/src/main/resources/application.properties +++ b/spring-boot/validation/src/main/resources/application.properties @@ -1,2 +1,4 @@ io.reflectoring.jwt.private-key=test -io.reflectoring.jwt.validity-minutes=10 \ No newline at end of file +io.reflectoring.jwt.validity-minutes=10 + +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..09a0674ac --- /dev/null +++ b/spring-boot/validation/src/main/resources/validation-errors.properties @@ -0,0 +1,2 @@ +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 9e5fec84678ad35f916935e4da0c1ef6ca96e3e6 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:42:09 +0530 Subject: [PATCH 6/7] refactor: existing code --- .../io/reflectoring/validation/Input.java | 21 +++------- .../validation/InputWithCustomValidator.java | 29 +++----------- .../io/reflectoring/validation/IpAddress.java | 10 ++--- .../validation/IpAddressValidator.java | 32 ++++++++------- .../ErrorHandlingControllerAdvice.java | 39 ++++++++++-------- .../ValidationErrorResponse.java | 17 -------- .../controlleradvice/Violation.java | 23 ++++------- .../ValidateParametersController.java | 13 +++--- .../validation/IpAddressValidatorTest.java | 11 ++++- ...ProgrammaticallyValidatingServiceTest.java | 3 -- .../ValidateParametersControllerTest.java | 40 ++++++++++++++----- .../ValidateRequestBodyControllerTest.java | 35 ++++++++-------- .../service/ValidatingServiceTest.java | 3 -- .../ValidatingServiceWithGroupsTest.java | 3 -- 14 files changed, 126 insertions(+), 153 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/Input.java b/spring-boot/validation/src/main/java/io/reflectoring/validation/Input.java index 2ef3e9339..48323ee41 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}$", message = "{ip-address.invalid}") 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; - } -} +} \ No newline at end of file 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 48cb9cde5..0bdf0cff8 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 @@ -10,7 +10,11 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter @Entity public class InputWithCustomValidator { @@ -29,27 +33,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; - } -} +} \ No newline at end of file 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 149d73e21..df62921a3 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,16 +10,16 @@ import jakarta.validation.Constraint; import jakarta.validation.Payload; -@Target({ FIELD }) +@Documented +@Target(FIELD) @Retention(RUNTIME) @Constraint(validatedBy = IpAddressValidator.class) -@Documented public @interface IpAddress { String message() default "{ip-address.invalid}"; - Class<?>[] groups() default { }; + Class<?>[] groups() default {}; - Class<? extends Payload>[] payload() default { }; + Class<? extends Payload>[] payload() default {}; -} +} \ No newline at end of file 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 5d02d02d8..bd33964d2 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,25 +8,27 @@ public class IpAddressValidator implements ConstraintValidator<IpAddress, String> { + 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) { - 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()) { + 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.valueOf(matcher.group(i)); - if (octet > 255) { - return false; - } - } - return true; } - } catch (Exception e) { - return false; } + return true; } -} +} \ No newline at end of file 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 d23669dd3..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 @@ -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 ec294ac9c..000000000 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/controller/controlleradvice/ValidationErrorResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.reflectoring.validation.controller.controlleradvice; - -import java.util.ArrayList; -import java.util.List; - -public class ValidationErrorResponse { - - private List<Violation> violations = new ArrayList<>(); - - public List<Violation> getViolations() { - return violations; - } - - public void setViolations(List<Violation> 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..b26a0ec3f 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; -public class Violation { - - private final String fieldName; +import lombok.AllArgsConstructor; +import lombok.Getter; - private final String message; +@Getter +@AllArgsConstructor +public class Violation { - public Violation(String fieldName, String message) { - this.fieldName = fieldName; - this.message = message; - } + private String fieldName; - public String getFieldName() { - return fieldName; - } + private String message; - public String getMessage() { - return message; - } -} +} \ No newline at end of file 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..6086c8385 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,14 +9,13 @@ 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; import jakarta.validation.constraints.Min; -@RestController @Validated +@RestController class ValidateParametersController { @GetMapping("/validatePathVariable/{id}") @@ -28,12 +28,11 @@ ResponseEntity<String> 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/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 481b77bdf..173415bdc 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,16 +1,17 @@ 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.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 { @@ -18,22 +19,41 @@ class ValidateParametersControllerTest { private MockMvc mvc; @Test - void whenPathVariableIsInvalid_thenReturnsStatus400() throws Exception { - mvc.perform(get("/validatePathVariable/3")) - .andExpect(status().isBadRequest()); + @SneakyThrows + void whenPathVariableIsInvalid_thenReturnsStatus400() { + String apiPath = "/validatePathVariable/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 - void whenRequestParameterIsInvalid_thenReturnsStatus400() throws Exception { - mvc.perform(get("/validateRequestParameter") + @SneakyThrows + void whenRequestParameterIsInvalid_thenReturnsStatus400() { + String apiPath = "/validateRequestParameter"; + mvc.perform(get(apiPath) .param("param", "3")) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.status").value(400)) + .andExpect(jsonPath("$.instance").value(apiPath)) + .andExpect(jsonPath("$.detail").value(startsWith("Validation error:"))); } @Test - void whenPathVariableIsValid_thenReturnsStatus200() throws Exception { + @SneakyThrows + void whenPathVariableIsValid_thenReturnsStatus200() { mvc.perform(get("/validatePathVariable/10")) .andExpect(status().isOk()); } + + @Test + @SneakyThrows + void whenRequestParameterIsValid_thenReturnsStatus200() { + mvc.perform(get("/validateRequestParameter") + .param("param", "10")) + .andExpect(status().isOk()); + } } \ No newline at end of file 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..21d88ff5c 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 { @@ -25,31 +23,28 @@ class ValidateRequestBodyControllerTest { @Autowired private ObjectMapper objectMapper; + + private static final String API_PATH = "/validateBody"; @Test - void whenInputIsInvalid_thenReturnsStatus400() throws Exception { + @SneakyThrows + void whenInputIsInvalid_thenReturnsStatus400() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); - mvc.perform(post("/validateBody") + mvc.perform(post(API_PATH) .contentType("application/json") .content(body)) .andExpect(status().isBadRequest()); } - private Input invalidInput() { - Input input = new Input(); - input.setIpAddress("invalid"); - input.setNumberBetweenOneAndTen(99); - return input; - } - @Test - void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() throws Exception { + @SneakyThrows + void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() { Input input = invalidInput(); String body = objectMapper.writeValueAsString(input); - MvcResult result = mvc.perform(post("/validateBody") + MvcResult result = mvc.perform(post(API_PATH) .contentType("application/json") .content(body)) .andExpect(status().isBadRequest()) @@ -59,16 +54,24 @@ void whenInputIsInvalid_thenReturnsStatus400WithErrorObject() throws Exception { } @Test - void whenInputIsValid_thenReturnsStatus200() throws Exception { + @SneakyThrows + void whenInputIsValid_thenReturnsStatus200() { Input input = validInput(); String body = objectMapper.writeValueAsString(input); - mvc.perform(post("/validateBody") + mvc.perform(post(API_PATH) .contentType("application/json") .content(body)) .andExpect(status().isOk()); } + private Input invalidInput() { + Input input = new Input(); + input.setIpAddress("invalid"); + input.setNumberBetweenOneAndTen(99); + return input; + } + private Input validInput() { Input input = new Input(); input.setIpAddress("255.255.255.255"); 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 28813e8445d8ee36c0141906dc0f7cda231c3106 Mon Sep 17 00:00:00 2001 From: Hardik Singh Behl <hardik.behl7444@gmail.com> Date: Fri, 21 Jun 2024 11:52:04 +0530 Subject: [PATCH 7/7] minor fix --- .../java/io/reflectoring/validation/ProgrammerStereotype.java | 4 ++-- .../controlleradvice/ErrorHandlingControllerAdvice.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 index 7503d5bd4..220022721 100644 --- a/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java +++ b/spring-boot/validation/src/main/java/io/reflectoring/validation/ProgrammerStereotype.java @@ -18,8 +18,8 @@ String message() default "Stereotype violation detected! IDE and language not vibing."; - Class<?>[] groups() default { }; + Class<?>[] groups() default {}; - Class<? extends Payload>[] payload() default { }; + Class<? extends Payload>[] payload() default {}; } \ No newline at end of file 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 2e18ccb27..63fadd508 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 @@ -20,7 +20,7 @@ class ErrorHandlingControllerAdvice { @ExceptionHandler(ConstraintViolationException.class) ProblemDetail handle(ConstraintViolationException exception) { - List < Violation > violations = new ArrayList < > (); + List<Violation> violations = new ArrayList<>(); for (ConstraintViolation<?> violation: exception.getConstraintViolations()) { violations.add(new Violation(violation.getPropertyPath().toString(), violation.getMessage())); } @@ -32,7 +32,7 @@ ProblemDetail handle(ConstraintViolationException exception) { @ExceptionHandler(MethodArgumentNotValidException.class) ProblemDetail handle(MethodArgumentNotValidException exception) { - List < Violation > violations = new ArrayList < > (); + List<Violation> violations = new ArrayList<>(); for (FieldError fieldError: exception.getBindingResult().getFieldErrors()) { violations.add(new Violation(fieldError.getField(), fieldError.getDefaultMessage())); }