Skip to content

Support for Spring Boot DevTools Restart - #172

Merged
JohannesRabauer merged 13 commits into
developfrom
spring-boot-dev-tools-support
Oct 16, 2024
Merged

Support for Spring Boot DevTools Restart#172
JohannesRabauer merged 13 commits into
developfrom
spring-boot-dev-tools-support

Conversation

@AB-xdev

Copy link
Copy Markdown
Member
  • Add support for shuting down the storage during application shutdown
    • By default only enabled when Spring DevTools are active
      • This should fix "StorageExceptionInitialization: Active storage for ... already exists" errors during DevTools restart

@AB-xdevAB-xdev added the enhancement New feature or request label Oct 10, 2024
@AB-xdev
AB-xdev marked this pull request as draft October 10, 2024 13:18
@AB-xdev
AB-xdev marked this pull request as ready for review October 11, 2024 11:16
@JohannesRabauer

Copy link
Copy Markdown
Member

Tried the code in the demo by adding spring-dev-tools to it.

After the second start i immediately receive following error:

09:11:11.996 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
software.xdev.spring.data.eclipse.store.exceptions.InvalidRootException: Root object of type software.xdev.spring.data.eclipse.store.repository.root.VersionedRoot is invalid.
at software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage.startStorageManager(EclipseStoreStorage.java:137) ~[classes/:?]
at software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage.ensureEntitiesInRoot(EclipseStoreStorage.java:102) ~[classes/:?]
at software.xdev.spring.data.eclipse.store.repository.EclipseStoreStorage.getEntityProvider(EclipseStoreStorage.java:236) ~[classes/:?]
at software.xdev.spring.data.eclipse.store.repository.support.SimpleEclipseStoreRepository.findAll(SimpleEclipseStoreRepository.java:211) ~[classes/:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:173) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:148) ~[spring-data-commons-3.3.4.jar:3.3.4]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.1.13.jar:6.1.13]
at jdk.proxy3/jdk.proxy3.$Proxy81.findAll(Unknown Source) ~[?:?]
at software.xdev.spring.data.eclipse.store.demo.complex.VetService.logVetEntries(VetService.java:43) ~[classes/:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:355) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:379) ~[spring-tx-6.1.13.jar:6.1.13]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[spring-aop-6.1.13.jar:6.1.13]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[spring-aop-6.1.13.jar:6.1.13]
at software.xdev.spring.data.eclipse.store.demo.complex.VetService$$SpringCGLIB$$0.logVetEntries(<generated>) ~[classes/:?]
at software.xdev.spring.data.eclipse.store.demo.complex.ComplexDemoApplication.vetCalls(ComplexDemoApplication.java:70) ~[classes/:?]
at software.xdev.spring.data.eclipse.store.demo.complex.ComplexDemoApplication.run(ComplexDemoApplication.java:49) ~[classes/:?]
at org.springframework.boot.SpringApplication.lambda$callRunner$5(SpringApplication.java:790) ~[spring-boot-3.3.4.jar:3.3.4]
at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:83) ~[spring-core-6.1.13.jar:6.1.13]
at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-6.1.13.jar:6.1.13]
at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:88) ~[spring-core-6.1.13.jar:6.1.13]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) ~[spring-boot-3.3.4.jar:3.3.4]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:789) ~[spring-boot-3.3.4.jar:3.3.4]
at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:774) [spring-boot-3.3.4.jar:3.3.4]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:?]
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[?:?]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[?:?]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774) [spring-boot-3.3.4.jar:3.3.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:342) [spring-boot-3.3.4.jar:3.3.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) [spring-boot-3.3.4.jar:3.3.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) [spring-boot-3.3.4.jar:3.3.4]
at software.xdev.spring.data.eclipse.store.demo.complex.ComplexDemoApplication.main(ComplexDemoApplication.java:43) [classes/:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) [spring-boot-devtools-3.3.4.jar:3.3.4]

image

The image suggest, that there is a different version of the class "VersionedRoot" in the store than it is in the current ClassLoader. That is a pretty huge problem. In this specific instance, it could be fixed pretty easily, but if the user tries to do something like that in the application, it will fail as well.

@JohannesRabauer

Copy link
Copy Markdown
Member

Alright. This was basically an error with the ComplexConfiguration and should be fixed. Now i can't provoke Spring to do a reload by changing stored entities.

@sonarqubecloud

Copy link
Copy Markdown

@JohannesRabauer
JohannesRabauer merged commit f2cec3d into developOct 16, 2024
@JohannesRabauer
JohannesRabauer deleted the spring-boot-dev-tools-support branch October 16, 2024 08:16
xdev-gh-bot pushed a commit that referenced this pull request Jul 7, 2025
…plugins-maven-gpg-plugin-3.x
Update dependency org.apache.maven.plugins:maven-gpg-plugin to v3.2.8
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@AB-xdev@JohannesRabauer