Skip to content

Commit 253927e

Browse files
Merge branch 'develop' into spring-boot-dev-tools-support
2 parents c5971f4 + 9a3c56b commit 253927e

16 files changed

Lines changed: 634 additions & 18 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
* Add support for shuting down the storage during application shutdown
44
* By default only enabled when Spring DevTools are active
5-
* This should fix "StorageExceptionInitialization: Active storage for ... already exists" errors during DevTools restart
5+
* This should fix "StorageExceptionInitialization: Active storage for ... already exists" errors during DevTools restart
6+
* Added [Jakarta Bean Validation Constraints](https://jakarta.ee/learn/docs/jakartaee-tutorial/current/beanvalidation/bean-validation/bean-validation.html#_using_jakarta_bean_validation_constraints) with Hibernate validator for entities.
67

78
# 2.2.2
89

spring-data-eclipse-store/pom.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@
5454
<org.springframework.boot.version>3.3.4</org.springframework.boot.version>
5555
<org.eclipse.store.version>1.4.0</org.eclipse.store.version>
5656
<org.eclipse.serializer.version>1.4.0</org.eclipse.serializer.version>
57+
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
58+
<jakarta.el-api.version>6.0.1</jakarta.el-api.version>
59+
<expressly.version>6.0.0-M1</expressly.version>
60+
<hibernate-core.version>6.6.1.Final</hibernate-core.version>
5761
</properties>
5862

5963
<repositories>
@@ -164,6 +168,37 @@
164168
</exclusion>
165169
</exclusions>
166170
</dependency>
171+
172+
<dependency>
173+
<groupId>jakarta.validation</groupId>
174+
<artifactId>jakarta.validation-api</artifactId>
175+
</dependency>
176+
<dependency>
177+
<groupId>org.hibernate.validator</groupId>
178+
<artifactId>hibernate-validator</artifactId>
179+
<version>${hibernate-validator.version}</version>
180+
</dependency>
181+
<dependency>
182+
<groupId>org.hibernate.orm</groupId>
183+
<artifactId>hibernate-core</artifactId>
184+
<version>${hibernate-core.version}</version>
185+
<exclusions>
186+
<exclusion>
187+
<artifactId>antlr4-runtime</artifactId>
188+
<groupId>org.antlr</groupId>
189+
</exclusion>
190+
</exclusions>
191+
</dependency>
192+
<dependency>
193+
<groupId>jakarta.el</groupId>
194+
<artifactId>jakarta.el-api</artifactId>
195+
<version>${jakarta.el-api.version}</version>
196+
</dependency>
197+
<dependency>
198+
<groupId>org.glassfish.expressly</groupId>
199+
<artifactId>expressly</artifactId>
200+
<version>${expressly.version}</version>
201+
</dependency>
167202

168203
<dependency>
169204
<groupId>com.googlecode.cqengine</groupId>

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/importer/EclipseStoreDataImporter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public EclipseStoreDataImporter(final EclipseStoreClientConfiguration configurat
5151
{
5252
this.configuration = configuration;
5353
}
54-
54+
5555
/**
5656
* Imports entities from all given {@link EntityManagerFactory}s that are available into the EclipseStore storage.
5757
* <p>
@@ -266,6 +266,7 @@ private <T> void createRepositoryForType(
266266
storageInstance,
267267
new SupportedChecker.Implementation(),
268268
storageInstance,
269+
this.configuration.getValidator(),
269270
this.configuration.getClassLoaderProvider()
270271
),
271272
domainClass,

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/config/EclipseStoreClientConfiguration.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package software.xdev.spring.data.eclipse.store.repository.config;
1717

1818
import org.eclipse.serializer.reflect.ClassLoaderProvider;
19+
import jakarta.validation.Validation;
20+
import jakarta.validation.Validator;
21+
1922
import org.eclipse.store.integrations.spring.boot.types.configuration.EclipseStoreProperties;
2023
import org.eclipse.store.integrations.spring.boot.types.factories.EmbeddedStorageFoundationFactory;
2124
import org.eclipse.store.storage.embedded.types.EmbeddedStorageFoundation;
@@ -25,6 +28,7 @@
2528
import org.springframework.beans.factory.annotation.Autowired;
2629
import org.springframework.beans.factory.annotation.Value;
2730
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
31+
import org.springframework.context.annotation.Bean;
2832
import org.springframework.context.annotation.ComponentScan;
2933
import org.springframework.context.annotation.Configuration;
3034
import org.springframework.context.event.ContextClosedEvent;
@@ -199,4 +203,10 @@ public void shutdownStorageOnContextClosed(final ContextClosedEvent event)
199203
this.storageInstance.stop();
200204
}
201205
}
206+
207+
@Bean
208+
public Validator getValidator()
209+
{
210+
return Validation.buildDefaultValidatorFactory().getValidator();
211+
}
202212
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactory.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Optional;
1919

2020
import jakarta.annotation.Nonnull;
21+
import jakarta.validation.Validator;
2122

2223
import org.springframework.data.mapping.model.BasicPersistentEntity;
2324
import org.springframework.data.repository.core.EntityInformation;
@@ -46,13 +47,16 @@ public class EclipseStoreRepositoryFactory extends RepositoryFactorySupport
4647
{
4748
private final EclipseStoreStorage storage;
4849
private final PlatformTransactionManager transactionManager;
50+
private final Validator validator;
4951

5052
public EclipseStoreRepositoryFactory(
5153
final EclipseStoreStorage storage,
52-
final PlatformTransactionManager transactionManager)
54+
final PlatformTransactionManager transactionManager,
55+
final Validator validator)
5356
{
5457
this.storage = storage;
5558
this.transactionManager = transactionManager;
59+
this.validator = validator;
5660
}
5761

5862
@Override
@@ -83,6 +87,7 @@ private <T> WorkingCopier<T> createWorkingCopier(
8387
storage,
8488
new SupportedChecker.Implementation(),
8589
storage,
90+
this.validator,
8691
storage.getClassLoaderProvider()
8792
);
8893
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/EclipseStoreRepositoryFactoryBean.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ protected RepositoryFactorySupport createRepositoryFactory()
8181
final EclipseStoreClientConfiguration ensuredConfiguration = this.ensureConfiguration();
8282
return new EclipseStoreRepositoryFactory(
8383
ensuredConfiguration.getStorageInstance(),
84-
ensuredConfiguration.getTransactionManagerInstance()
84+
ensuredConfiguration.getTransactionManagerInstance(),
85+
ensuredConfiguration.getValidator()
8586
);
8687
}
8788

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/AbstractRegisteringCopier.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.support.copier.registering;
1717

18+
import jakarta.validation.Validator;
19+
1820
import org.eclipse.serializer.Serializer;
1921
import org.eclipse.serializer.SerializerFoundation;
2022
import org.eclipse.serializer.persistence.binary.jdk17.java.util.BinaryHandlerImmutableCollectionsList12;
@@ -45,6 +47,7 @@ protected AbstractRegisteringCopier(
4547
final RegisteringWorkingCopyAndOriginal register,
4648
final ObjectSwizzling objectSwizzling,
4749
final WorkingCopier<?> copier,
50+
final Validator validator,
4851
final ClassLoaderProvider currentClassLoaderProvider
4952
)
5053
{
@@ -56,8 +59,10 @@ protected AbstractRegisteringCopier(
5659
this.createSerializerFoundation(),
5760
objectSwizzling,
5861
copier,
59-
currentClassLoaderProvider
60-
)
62+
currentClassLoaderProvider,
63+
copier
64+
),
65+
validator
6166
);
6267
}
6368

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,14 @@
1818
import java.util.HashMap;
1919
import java.util.Map;
2020
import java.util.Queue;
21+
import java.util.Set;
2122
import java.util.concurrent.ConcurrentLinkedQueue;
2223
import java.util.function.Supplier;
24+
import java.util.stream.Collectors;
25+
26+
import jakarta.validation.ConstraintViolation;
27+
import jakarta.validation.ConstraintViolationException;
28+
import jakarta.validation.Validator;
2329

2430
import org.eclipse.serializer.persistence.binary.types.Binary;
2531
import org.eclipse.serializer.persistence.binary.types.BinaryStorer;
@@ -45,15 +51,19 @@ public class EclipseSerializerRegisteringCopier implements AutoCloseable
4551
private final Supplier<PersistenceManager<Binary>> persistenceManagerSupplier;
4652
private final SupportedChecker supportedChecker;
4753
private final RegisteringWorkingCopyAndOriginal register;
54+
private final Validator validator;
4855

4956
public EclipseSerializerRegisteringCopier(
5057
final SupportedChecker supportedChecker,
5158
final RegisteringWorkingCopyAndOriginal register,
52-
final Supplier<PersistenceManager<Binary>> persistenceManagerSupplier)
59+
final Supplier<PersistenceManager<Binary>> persistenceManagerSupplier,
60+
final Validator validator
61+
)
5362
{
5463
this.supportedChecker = supportedChecker;
5564
this.register = register;
5665
this.persistenceManagerSupplier = persistenceManagerSupplier;
66+
this.validator = validator;
5767
this.persistenceManagers = new ConcurrentLinkedQueue<>();
5868
}
5969

@@ -138,10 +148,7 @@ private <T> T copy(final T source, final PersistenceManager<Binary> persistenceM
138148
{
139149
return;
140150
}
141-
if(copiedObject != null && !this.supportedChecker.isSupported(copiedObject.getClass()))
142-
{
143-
throw new DataTypeNotSupportedException(copiedObject.getClass());
144-
}
151+
this.validate(copiedObject);
145152
summarizer.incrementCopiedObjectsCount();
146153
if(DataTypeUtil.isPrimitiveType(copiedObject.getClass()))
147154
{
@@ -167,6 +174,30 @@ private <T> T copy(final T source, final PersistenceManager<Binary> persistenceM
167174
return returnValue;
168175
}
169176

177+
private void validate(final Object copiedObject)
178+
{
179+
if(copiedObject != null)
180+
{
181+
if(!this.supportedChecker.isSupported(copiedObject.getClass()))
182+
{
183+
throw new DataTypeNotSupportedException(copiedObject.getClass());
184+
}
185+
final Set<ConstraintViolation<Object>> violations = this.validator.validate(copiedObject);
186+
if(!violations.isEmpty())
187+
{
188+
final String violationsAsMessage = violations.stream()
189+
.map(cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage())
190+
.collect(Collectors.joining(", "));
191+
192+
throw new ConstraintViolationException(
193+
"Error validating " + copiedObject.getClass().getName() + ":" + System.lineSeparator()
194+
+ violationsAsMessage,
195+
violations
196+
);
197+
}
198+
}
199+
}
200+
170201
private static class Summarizer
171202
{
172203
private long copiedObjectsCount;

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringStorageToWorkingCopyCopier.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.support.copier.registering;
1717

18+
import jakarta.validation.Validator;
19+
1820
import org.eclipse.serializer.reference.ObjectSwizzling;
1921
import org.eclipse.serializer.reflect.ClassLoaderProvider;
2022

@@ -34,13 +36,16 @@ public RegisteringStorageToWorkingCopyCopier(
3436
final SupportedChecker supportedChecker,
3537
final ObjectSwizzling objectSwizzling,
3638
final WorkingCopier<?> copier,
37-
final ClassLoaderProvider currentClassLoaderProvider)
39+
final Validator validator,
40+
final ClassLoaderProvider currentClassLoaderProvider
41+
)
3842
{
3943
super(
4044
supportedChecker,
4145
registry::register,
4246
objectSwizzling,
4347
copier,
48+
validator,
4449
currentClassLoaderProvider
4550
);
4651
}

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/RegisteringWorkingCopyToStorageCopier.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package software.xdev.spring.data.eclipse.store.repository.support.copier.registering;
1717

18+
import jakarta.validation.Validator;
19+
1820
import org.eclipse.serializer.reference.ObjectSwizzling;
1921
import org.eclipse.serializer.reflect.ClassLoaderProvider;
2022

@@ -35,13 +37,16 @@ public RegisteringWorkingCopyToStorageCopier(
3537
final SupportedChecker supportedChecker,
3638
final ObjectSwizzling objectSwizzling,
3739
final WorkingCopier<?> copier,
38-
final ClassLoaderProvider currentClassLoaderProvider)
40+
final Validator validator,
41+
final ClassLoaderProvider currentClassLoaderProvider
42+
)
3943
{
4044
super(
4145
supportedChecker,
4246
registry::invertRegister,
4347
objectSwizzling,
4448
copier,
49+
validator,
4550
currentClassLoaderProvider
4651
);
4752
}

0 commit comments

Comments
 (0)