crnk-project / crnk-framework

JSON API library for Java
Apache License 2.0
287 stars 156 forks source link

Support Spring Boot 3 and `jakarta` #882

Open joshuapsteele opened 1 year ago

joshuapsteele commented 1 year ago

Branch and PR inspired by Issue 869: https://github.com/crnk-project/crnk-framework/issues/869

The goal is to support Spring Boot 3.

kjthorpe18 commented 1 year ago
ValidationClientModuleFactoryTest > test FAILED
    jakarta.validation.ValidationException: HV000183: Unable to initialize 'jakarta.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead
        at app//org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:211)
        at app//org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:97)
        at app//org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getDefaultMessageInterpolator(AbstractConfigurationImpl.java:575)
        at app//org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(AbstractConfigurationImpl.java:834)
        at app//org.hibernate.validator.internal.engine.AbstractConfigurationImpl.getMessageInterpolator(AbstractConfigurationImpl.java:485)
        at app//org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:157)
        at app//org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
        at app//org.hibernate.validator.internal.engine.AbstractConfigurationImpl.buildValidatorFactory(AbstractConfigurationImpl.java:453)
        at app//jakarta.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
        at app//io.crnk.validation.ValidationModule.<init>(ValidationModule.java:23)
        at app//io.crnk.validation.ValidationModule.create(ValidationModule.java:36)
        at app//io.crnk.validation.ValidationModule.create(ValidationModule.java:32)
        at app//io.crnk.validation.internal.ValidationClientModuleFactory.create(ValidationClientModuleFactory.java:10)
        at app//io.crnk.validation.internal.ValidationClientModuleFactory.create(ValidationClientModuleFactory.java:6)
        at app//io.crnk.validation.internal.ValidationClientModuleFactoryTest.test(ValidationClientModuleFactoryTest.java:25)

        Caused by:
        java.lang.NoClassDefFoundError: com/sun/el/ExpressionFactoryImpl
            at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:203)
            ... 14 more

            Caused by:
            java.lang.ClassNotFoundException: com.sun.el.ExpressionFactoryImpl
                at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:203)
                ... 14 more

Getting this error from many tests - I tried adding 'jakarta.el:jakarta.el-api:5.0.1' based on stackoverflow questions about the same error (but of the javax variety), but no change. Also open to suggestions.

whgibbo commented 1 year ago

@jsteelepfpt Have started some more changes which once I get the Junit 4 -> 5 changes done I'll raise a PR into your branch.. My changes are on https://github.com/whgibbo/crnk-framework/tree/CRNK-JAKARTA-WHG currently.

kjthorpe18 commented 11 months ago

Next focus is Spring MVC changes. WebMvcMetricsAutoConfiguration seems to be gone, and WebMvcTagsProvider/DefaultWebMvcTagsProvider is marked for removal in Spring Boot 3.2.

From what I can tell, Crnk only overrode the DefaultWebMvcTagsProvider to "enhance" the URL in MVC metrics. We may be able to do the same with DefaultServerRequestObservationConvention, if necessary. @remmeier was the original author of this section in WebMvcTagsProvider. See: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Metrics-3.0

kjthorpe18 commented 11 months ago

I've been excluding crnk-setup-cdi to work on other failures, but when including it, I get test errors when running. I can't figure out where this javax dependency is coming from. Any assistance here would be appreciated!

Edit: see https://stackoverflow.com/questions/77319334/java-lang-noclassdeffounderror-javax-enterprise-context-spi-contextual-when-swi/77512767#77512767, this may be because an external dependency isn't using jakarta yet.

For example:

CdiTransactionRunnerTest > initializationError FAILED
    java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Contextual
        at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
        at java.base/java.lang.Class.getConstructor0(Class.java:3578)
        at java.base/java.lang.Class.getConstructor(Class.java:2271)
        at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
        at org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder$DefensiveAnnotatedBuilder.buildRunner(DefensiveAllDefaultPossibilitiesBuilder.java:114)
        at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
        at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
        at org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder.runnerForClass(DefensiveAllDefaultPossibilitiesBuilder.java:57)
        at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
        at org.junit.vintage.engine.discovery.ClassSelectorResolver.resolveTestClass(ClassSelectorResolver.java:66)
        at org.junit.vintage.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:47)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$2(EngineDiscoveryRequestResolution.java:135)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
        at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
        at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:189)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:126)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:92)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:83)
        at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:113)
        at org.junit.vintage.engine.discovery.VintageDiscoverer.discover(VintageDiscoverer.java:42)
        at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:64)
        at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:152)
        at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:134)
        at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:108)
        at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:80)
        at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:110)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
        at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:118)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:93)
        at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:88)
        at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62)
        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.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
        at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65)
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

        Caused by:
        java.lang.ClassNotFoundException: javax.enterprise.context.spi.Contextual
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
            ... 59 more
byrondaniels commented 10 months ago

Hello! is this still being worked on? im open to help finish this but i dont want to duplicate work if youre working your way through this already

kjthorpe18 commented 10 months ago

Hello! is this still being worked on? im open to help finish this but i dont want to duplicate work if youre working your way through this already

@byrondaniels Hi! I haven't been able to work on this recently, so feel free to help out if you'd like!

tory-kk commented 3 months ago

Could someone invite me to the repository? Would like to help.

aawaken commented 2 months ago

just wanted to give :+1: for very much looking forward to see Crnk moved to Jakarta

joshuapsteele commented 2 months ago

Neither @kjthorpe18 nor I have touched this in quite some time. We welcome others to join in and carry this forward!

DerekVonk commented 2 months ago

Neither @kjthorpe18 nor I have touched this in quite some time. We welcome others to join in and carry this forward!

I see it hasn't been touched in some time and also notice the certificates or ownership on the documentation website is changed/no longer working. Do any of you know what needs to be done to fix this or can we consider this orphaned?

mflorczak commented 2 months ago

Neither @kjthorpe18 nor I have touched this in quite some time. We welcome others to join in and carry this forward!

I see it hasn't been touched in some time and also notice the certificates or ownership on the documentation website is changed/no longer working. Do any of you know what needs to be done to fix this or can we consider this orphaned?

I think nobody has access to this repository to merge PR so I think it was orphaned. Maybe we need create fork from this repo and start new product. Idea with crnk was preaty good but we have to migrate it to spring 3.

tory-kk commented 1 month ago

Our team has prepared a separate PR with build fixes for the current PR. Could anyone please review and merge it? https://github.com/joshuapsteele/crnk-framework/pull/3

@joshuapsteele @kjthorpe18 @whgibbo

mflorczak commented 1 month ago

Our team have prepared a separate PR with build fixes for the current PR. Could anyone please review and merge it? joshuapsteele#3

I think nobody have permission to accept and merge it.

kjthorpe18 commented 4 weeks ago

I've merged @tory-kk's fixes into this branch, but as mentioned above I think the overall project is unmaintained, and I'm not sure who will have permission to approve & merge this PR.

tory-kk commented 3 weeks ago

@kjthorpe18 thank you :) What else remains to be done to prepare the branch for the merge and release? @remmeier would you be able to merge and release a new version when the PR is ready?