diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 7908617..0296b44 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -14,7 +14,15 @@
+
+
+
+
+
+
+
+
@@ -30,6 +38,10 @@
+
+
+
+
diff --git a/lombok.config b/lombok.config
new file mode 100644
index 0000000..5ffcbcb
--- /dev/null
+++ b/lombok.config
@@ -0,0 +1,9 @@
+config.stopBubbling = true
+
+# Required for NullAway to work
+lombok.addLombokGeneratedAnnotation = true
+
+# Copy JSpecify annotations to generated code (constructors, getters, setters)
+lombok.copyableAnnotations += org.jspecify.annotations.Nullable
+lombok.copyableAnnotations += org.jspecify.annotations.NonNull
+lombok.addNullAnnotations = jspecify
diff --git a/pom.xml b/pom.xml
index d4b27b4..1f75985 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,11 +1,12 @@
-
+
4.0.0
org.springframework.boot
spring-boot-starter-parent
- 4.0.0
+ 4.0.1
@@ -17,8 +18,20 @@
25
+ 2.45.0
+ 0.12.14
+
+
+
+ it.aboutbits
+ archunit-toolbox
+ 1.0.0-RC1
+
+
+
+
org.springframework.boot
@@ -135,6 +148,26 @@
2.0.2
test
+
+
+
+ com.tngtech.archunit
+ archunit-junit5
+ 1.4.1
+ test
+
+
+ com.tngtech.archunit
+ archunit-junit5-api
+ 1.4.1
+ compile
+
+
+
+ it.aboutbits
+ archunit-toolbox
+ test
+
@@ -156,7 +189,36 @@
lombok
${lombok.version}
+
+ com.google.errorprone
+ error_prone_core
+ ${errorprone.version}
+
+
+ com.uber.nullaway
+ nullaway
+ ${nullaway.version}
+
+
+ -Amapstruct.unmappedTargetPolicy=ERROR
+ -XDcompilePolicy=simple
+ --should-stop=ifError=FLOW
+
+ -Xplugin:ErrorProne -XepDisableAllChecks -XepOpt:NullAway:AnnotatedPackages=it.aboutbits.springboot.toolbox -XepOpt:NullAway:JSpecifyMode=true -Xep:NullAway:ERROR -XepOpt:NullAway:ExcludedFieldAnnotations=org.mockito.InjectMocks,org.mockito.Mock
+
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
+ -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
+ -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
+ -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
+
+ true
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AbstractCustomTypeContributor.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AbstractCustomTypeContributor.java
index 3f0f02e..98e7473 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AbstractCustomTypeContributor.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AbstractCustomTypeContributor.java
@@ -6,10 +6,12 @@
import org.hibernate.boot.model.TypeContributor;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.descriptor.java.JavaType;
+import org.jspecify.annotations.NullMarked;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;
+@NullMarked
public abstract class AbstractCustomTypeContributor implements TypeContributor {
@SuppressWarnings("rawtypes")
private final Set> relevantTypes;
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AutoRegisteredJavaType.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AutoRegisteredJavaType.java
index 881a05b..09b5a7c 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AutoRegisteredJavaType.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/AutoRegisteredJavaType.java
@@ -1,6 +1,8 @@
package it.aboutbits.springboot.toolbox.autoconfiguration.persistence;
import org.hibernate.type.descriptor.java.JavaType;
+import org.jspecify.annotations.NullMarked;
+@NullMarked
public interface AutoRegisteredJavaType extends JavaType {
}
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/CustomTypeContributor.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/CustomTypeContributor.java
index 8bd8407..3faa4b1 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/CustomTypeContributor.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/persistence/CustomTypeContributor.java
@@ -1,5 +1,8 @@
package it.aboutbits.springboot.toolbox.autoconfiguration.persistence;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
public final class CustomTypeContributor extends AbstractCustomTypeContributor {
public CustomTypeContributor() {
super("it.aboutbits.springboot.toolbox");
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeConfiguration.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeConfiguration.java
index eeaadfd..d133ced 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeConfiguration.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeConfiguration.java
@@ -7,6 +7,7 @@
import it.aboutbits.springboot.toolbox.type.identity.EntityId;
import it.aboutbits.springboot.toolbox.web.CustomTypePropertyEditor;
import it.aboutbits.springboot.toolbox.web.EntityIdPropertyEditor;
+import org.jspecify.annotations.NullMarked;
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -18,6 +19,7 @@
import java.util.Set;
@Configuration
+@NullMarked
public class CustomTypeConfiguration {
@ControllerAdvice
public static class CustomTypePropertyBinder {
@@ -46,8 +48,8 @@ public JsonMapperBuilderCustomizer jsonCustomizer(CustomTypeScanner configuratio
// dynamic deserializers
configuration.getRelevantTypes()
- .forEach(type ->
- module.addDeserializer(type, new CustomTypeDeserializer(type))
+ .forEach(
+ type -> module.addDeserializer(type, new CustomTypeDeserializer(type))
);
// type-based deserializer
@@ -56,5 +58,4 @@ public JsonMapperBuilderCustomizer jsonCustomizer(CustomTypeScanner configuratio
return builder -> builder
.addModule(module);
}
-
}
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScanner.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScanner.java
index f374c31..36242c9 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScanner.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScanner.java
@@ -4,6 +4,7 @@
import it.aboutbits.springboot.toolbox.type.CustomType;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import org.jspecify.annotations.NullMarked;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -18,6 +19,7 @@
@Slf4j
@Getter
+@NullMarked
public class CustomTypeScanner {
private static final String LIBRARY_BASE_PACKAGE_NAME = "it.aboutbits.springboot.toolbox";
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScannerRegistrar.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScannerRegistrar.java
index a77f0b7..56535da 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScannerRegistrar.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/CustomTypeScannerRegistrar.java
@@ -1,5 +1,6 @@
package it.aboutbits.springboot.toolbox.autoconfiguration.web;
+import org.jspecify.annotations.NullMarked;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
@@ -8,6 +9,7 @@
import java.util.Objects;
+@NullMarked
public class CustomTypeScannerRegistrar implements ImportBeanDefinitionRegistrar {
/**
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/RegisterCustomTypesWithJacksonAndMvc.java b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/RegisterCustomTypesWithJacksonAndMvc.java
index c4d6ffe..8af1f3c 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/RegisterCustomTypesWithJacksonAndMvc.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/autoconfiguration/web/RegisterCustomTypesWithJacksonAndMvc.java
@@ -1,5 +1,6 @@
package it.aboutbits.springboot.toolbox.autoconfiguration.web;
+import org.jspecify.annotations.NullMarked;
import org.springframework.context.annotation.Import;
import java.lang.annotation.ElementType;
@@ -10,6 +11,7 @@
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({CustomTypeScannerRegistrar.class, CustomTypeConfiguration.class})
+@NullMarked
public @interface RegisterCustomTypesWithJacksonAndMvc {
String[] additionalTypePackages() default "";
}
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/exception/ClientRuntimeException.java b/src/main/java/it/aboutbits/springboot/toolbox/exception/ClientRuntimeException.java
index 156afcf..303fcd9 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/exception/ClientRuntimeException.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/exception/ClientRuntimeException.java
@@ -1,5 +1,8 @@
package it.aboutbits.springboot.toolbox.exception;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
public class ClientRuntimeException extends RuntimeException {
public ClientRuntimeException() {
}
diff --git a/src/main/java/it/aboutbits/springboot/toolbox/exception/ConstraintViolationExceptionBuilder.java b/src/main/java/it/aboutbits/springboot/toolbox/exception/ConstraintViolationExceptionBuilder.java
index 5caf125..22c2cc9 100644
--- a/src/main/java/it/aboutbits/springboot/toolbox/exception/ConstraintViolationExceptionBuilder.java
+++ b/src/main/java/it/aboutbits/springboot/toolbox/exception/ConstraintViolationExceptionBuilder.java
@@ -4,71 +4,82 @@
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Path;
import jakarta.validation.metadata.ConstraintDescriptor;
-import lombok.NonNull;
import org.hibernate.validator.internal.engine.path.PathImpl;
-import org.springframework.lang.Nullable;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
import java.util.HashSet;
import java.util.Set;
+@NullMarked
public final class ConstraintViolationExceptionBuilder {
private final Set> constraintViolations = new HashSet<>();
private ConstraintViolationExceptionBuilder() {
-
}
+ @SuppressWarnings("unused")
public static ConstraintViolationExceptionBuilder constraintViolation() {
return new ConstraintViolationExceptionBuilder();
}
+ @SuppressWarnings("unused")
public ConstraintViolationExceptionBuilder causedBy(
- @NonNull String propertyPath,
- @NonNull ExceptionMessageDefinition message
+ String propertyPath,
+ ExceptionMessageDefinition message
) {
return causedBy(propertyPath, message.code());
}
- public ConstraintViolationExceptionBuilder causedBy(@NonNull String propertyPath, @Nullable String message) {
+ @SuppressWarnings({"unused", "UnusedReturnValue"})
+ public ConstraintViolationExceptionBuilder causedBy(String propertyPath, String message) {
var constraintViolation = new CustomConstraintViolation(message, PathImpl.createPathFromString(propertyPath));
constraintViolations.add(constraintViolation);
return this;
}
- public ConstraintViolationExceptionBuilder causedBy(@NonNull ConstraintViolationException e) {
+ @SuppressWarnings({"unused", "UnusedReturnValue"})
+ public ConstraintViolationExceptionBuilder causedBy(ConstraintViolationException e) {
constraintViolations.addAll(e.getConstraintViolations());
return this;
}
+ @SuppressWarnings("unused")
public ConstraintViolationException create() {
return new ConstraintViolationException(constraintViolations);
}
+ @SuppressWarnings("unused")
public boolean hasCauses() {
return !constraintViolations.isEmpty();
}
- private record CustomConstraintViolation(String message, Path propertyPath) implements ConstraintViolation