redis-om-spring icon indicating copy to clipboard operation
redis-om-spring copied to clipboard

Please support java 17 records

Open joshlong opened this issue 2 years ago • 2 comments

joshlong avatar Mar 07 '22 23:03 joshlong

here's the exception I get when trying to use the following record:

@Document
record Person(@Id @Indexed String id, String name) {
}
/Users/jlong/.sdkman/candidates/java/17.0.1-open/bin/java -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Users/jlong/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.6777.52/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=55375:/Users/jlong/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.6777.52/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/jlong/Drive/LIVE/stackftw/target/classes:/Users/jlong/.m2/repository/com/redis/om/redis-om-spring/0.3.0-SNAPSHOT/redis-om-spring-0.3.0-20220308.201739-6.jar:/Users/jlong/.m2/repository/org/springframework/boot/spring-boot-starter/2.6.4/spring-boot-starter-2.6.4.jar:/Users/jlong/.m2/repository/org/springframework/boot/spring-boot/2.6.4/spring-boot-2.6.4.jar:/Users/jlong/.m2/repository/org/springframework/spring-context/5.3.16/spring-context-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-expression/5.3.16/spring-expression-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/boot/spring-boot-starter-logging/2.6.4/spring-boot-starter-logging-2.6.4.jar:/Users/jlong/.m2/repository/ch/qos/logback/logback-classic/1.2.10/logback-classic-1.2.10.jar:/Users/jlong/.m2/repository/ch/qos/logback/logback-core/1.2.10/logback-core-1.2.10.jar:/Users/jlong/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.17.1/log4j-to-slf4j-2.17.1.jar:/Users/jlong/.m2/repository/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar:/Users/jlong/.m2/repository/org/slf4j/jul-to-slf4j/1.7.36/jul-to-slf4j-1.7.36.jar:/Users/jlong/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/jlong/.m2/repository/org/yaml/snakeyaml/1.29/snakeyaml-1.29.jar:/Users/jlong/.m2/repository/org/springframework/data/spring-data-redis/2.6.2/spring-data-redis-2.6.2.jar:/Users/jlong/.m2/repository/org/springframework/data/spring-data-keyvalue/2.6.2/spring-data-keyvalue-2.6.2.jar:/Users/jlong/.m2/repository/org/springframework/data/spring-data-commons/2.6.2/spring-data-commons-2.6.2.jar:/Users/jlong/.m2/repository/org/springframework/spring-tx/5.3.16/spring-tx-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-beans/5.3.16/spring-beans-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-oxm/5.3.16/spring-oxm-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-aop/5.3.16/spring-aop-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-context-support/5.3.16/spring-context-support-5.3.16.jar:/Users/jlong/.m2/repository/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar:/Users/jlong/.m2/repository/org/springframework/boot/spring-boot-starter-aop/2.6.4/spring-boot-starter-aop-2.6.4.jar:/Users/jlong/.m2/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar:/Users/jlong/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.4/spring-boot-autoconfigure-2.6.4.jar:/Users/jlong/.m2/repository/com/redislabs/jrejson/1.5.0/jrejson-1.5.0.jar:/Users/jlong/.m2/repository/redis/clients/jedis/3.7.1/jedis-3.7.1.jar:/Users/jlong/.m2/repository/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar:/Users/jlong/.m2/repository/org/apache/commons/commons-pool2/2.11.1/commons-pool2-2.11.1.jar:/Users/jlong/.m2/repository/com/redislabs/jredisearch/2.2.0/jredisearch-2.2.0.jar:/Users/jlong/.m2/repository/org/json/json/20210307/json-20210307.jar:/Users/jlong/.m2/repository/com/redislabs/jrebloom/2.2.0/jrebloom-2.2.0.jar:/Users/jlong/.m2/repository/com/google/guava/guava/30.1.1-jre/guava-30.1.1-jre.jar:/Users/jlong/.m2/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar:/Users/jlong/.m2/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/jlong/.m2/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar:/Users/jlong/.m2/repository/org/checkerframework/checker-qual/3.8.0/checker-qual-3.8.0.jar:/Users/jlong/.m2/repository/com/google/errorprone/error_prone_annotations/2.5.1/error_prone_annotations-2.5.1.jar:/Users/jlong/.m2/repository/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar:/Users/jlong/.m2/repository/com/github/f4b6a3/ulid-creator/4.1.1/ulid-creator-4.1.1.jar:/Users/jlong/.m2/repository/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar:/Users/jlong/.m2/repository/com/squareup/javapoet/1.13.0/javapoet-1.13.0.jar:/Users/jlong/.m2/repository/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar:/Users/jlong/.m2/repository/org/springframework/spring-core/5.3.16/spring-core-5.3.16.jar:/Users/jlong/.m2/repository/org/springframework/spring-jcl/5.3.16/spring-jcl-5.3.16.jar redis.stackftw.StackftwApplication
OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.4)

2022-03-08 15:04:54.218  INFO 8136 --- [           main] redis.stackftw.StackftwApplication       : Starting StackftwApplication using Java 17.0.1 on mbp2021.local with PID 8136 (/Users/jlong/Drive/LIVE/stackftw/target/classes started by jlong in /Users/jlong/Drive/LIVE/stackftw)
2022-03-08 15:04:54.219  INFO 8136 --- [           main] redis.stackftw.StackftwApplication       : No active profile set, falling back to 1 default profile: "default"
2022-03-08 15:04:54.330  INFO 8136 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2022-03-08 15:04:54.330  INFO 8136 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data RedisJSON repositories in DEFAULT mode.
2022-03-08 15:04:54.344  INFO 8136 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10 ms. Found 1 RedisJSON repository interfaces.
2022-03-08 15:04:54.408  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'com.redis.om.spring.RedisModulesConfiguration' of type [com.redis.om.spring.RedisModulesConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.417  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.redis-org.springframework.boot.autoconfigure.data.redis.RedisProperties' of type [org.springframework.boot.autoconfigure.data.redis.RedisProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.418  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration' of type [org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.430  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'redisConnectionFactory' of type [org.springframework.data.redis.connection.jedis.JedisConnectionFactory] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.431  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'redisModulesClient' of type [com.redis.om.spring.client.RedisModulesClient] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.431  INFO 8136 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'redisModulesOperations' of type [com.redis.om.spring.ops.RedisModulesOperations] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-03-08 15:04:54.589  INFO 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : Creating Indexes......
2022-03-08 15:04:54.590  INFO 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : Found 1 @Document annotated Beans...
2022-03-08 15:04:54.591  INFO 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : Found @Document annotated class: redis.stackftw.Person
2022-03-08 15:04:54.591  INFO 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : FOUND @Indexed annotation on field of type: class java.lang.String
2022-03-08 15:04:54.606  WARN 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : Skipping index creation for redis.stackftw.PersonIdx because Index already exists
2022-03-08 15:04:54.607  INFO 8136 --- [           main] c.r.om.spring.RedisModulesConfiguration  : Found 0 @RedisHash annotated Beans...
2022-03-08 15:04:54.609  INFO 8136 --- [           main] redis.stackftw.StackftwApplication       : Started StackftwApplication in 0.488 seconds (JVM running for 0.659)
2022-03-08 15:04:54.675  INFO 8136 --- [           main] c.r.o.s.r.query.RediSearchQuery          : parameters: [Brian]
2022-03-08 15:04:54.689  INFO 8136 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-03-08 15:04:54.695 ERROR 8136 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.AssertionError: AssertionError (GSON 2.8.9): java.lang.IllegalAccessException: Can not set final java.lang.String field redis.stackftw.Person.name to java.lang.String
	at com.google.gson.Gson.fromJson(Gson.java:980) ~[gson-2.8.9.jar:na]
	at com.google.gson.Gson.fromJson(Gson.java:928) ~[gson-2.8.9.jar:na]
	at com.google.gson.Gson.fromJson(Gson.java:877) ~[gson-2.8.9.jar:na]
	at com.google.gson.Gson.fromJson(Gson.java:848) ~[gson-2.8.9.jar:na]
	at com.redislabs.modules.rejson.JReJSON.lambda$mget$1(JReJSON.java:288) ~[jrejson-1.5.0.jar:na]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
	at com.redislabs.modules.rejson.JReJSON.mget(JReJSON.java:289) ~[jrejson-1.5.0.jar:na]
	at com.redislabs.modules.rejson.JReJSON.mget(JReJSON.java:262) ~[jrejson-1.5.0.jar:na]
	at com.redis.om.spring.ops.json.JSONOperationsImpl.mget(JSONOperationsImpl.java:39) ~[redis-om-spring-0.3.0-20220308.201739-6.jar:na]
	at com.redis.om.spring.RedisJSONKeyValueAdapter.getAllOf(RedisJSONKeyValueAdapter.java:138) ~[redis-om-spring-0.3.0-20220308.201739-6.jar:na]
	at org.springframework.data.redis.core.RedisKeyValueAdapter.getAllOf(RedisKeyValueAdapter.java:385) ~[spring-data-redis-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.core.KeyValueTemplate.lambda$findAll$2(KeyValueTemplate.java:240) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.core.KeyValueTemplate.execute(KeyValueTemplate.java:362) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.core.KeyValueTemplate.executeRequired(KeyValueTemplate.java:377) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.core.KeyValueTemplate.findAll(KeyValueTemplate.java:238) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository.findAll(SimpleKeyValueRepository.java:128) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository.findAll(SimpleKeyValueRepository.java:42) ~[spring-data-keyvalue-2.6.2.jar:2.6.2]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:529) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:639) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:163) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.6.2.jar:2.6.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.16.jar:5.3.16]
	at redis.stackftw.$Proxy52.findAll(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.16.jar:5.3.16]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.16.jar:5.3.16]
	at redis.stackftw.$Proxy52.findAll(Unknown Source) ~[na:na]
	at redis.stackftw.StackftwApplication.lambda$commandLineRunner$0(StackftwApplication.java:28) ~[classes/:na]
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) ~[spring-boot-2.6.4.jar:2.6.4]
	at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:761) ~[spring-boot-2.6.4.jar:2.6.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-2.6.4.jar:2.6.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar:2.6.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar:2.6.4]
	at redis.stackftw.StackftwApplication.main(StackftwApplication.java:33) ~[classes/:na]
Caused by: java.lang.AssertionError: java.lang.IllegalAccessException: Can not set final java.lang.String field redis.stackftw.Person.name to java.lang.String
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:228) ~[gson-2.8.9.jar:na]
	at com.google.gson.Gson.fromJson(Gson.java:963) ~[gson-2.8.9.jar:na]
	... 58 common frames omitted
Caused by: java.lang.IllegalAccessException: Can not set final java.lang.String field redis.stackftw.Person.name to java.lang.String
	at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:76) ~[na:na]
	at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:80) ~[na:na]
	at java.base/jdk.internal.reflect.UnsafeQualifiedObjectFieldAccessorImpl.set(UnsafeQualifiedObjectFieldAccessorImpl.java:79) ~[na:na]
	at java.base/java.lang.reflect.Field.set(Field.java:799) ~[na:na]
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:133) ~[gson-2.8.9.jar:na]
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) ~[gson-2.8.9.jar:na]
	... 59 common frames omitted


Process finished with exit code 1

joshlong avatar Mar 08 '22 23:03 joshlong

any timeline for this please?

cervenf avatar Sep 16 '22 13:09 cervenf

any timeline for this please?

Likely will be part of the Sprigng 3.0.0/Java 17 release. Late December/Early January 2023.

bsbodden avatar Nov 01 '22 22:11 bsbodden

According to the JPA specification, an entity class must follow these requirements:

  • needs to be non-final (allow inheritance).
  • has a no-arg constructor.
  • has non-final attributes.

However, Java Record class is defined like this:

  • final
  • All args constructor
  • all attributes are final So, according to the JPA specifications, a Java Record cannot be used as an entity which means that we can't support them as well.

maorohana-redis avatar Feb 04 '23 17:02 maorohana-redis

Closing in agreement with @maorohana-redis - if other Spring Data projects figure out how to do this we will follow suit. Until then closing this as a wont-fix

bsbodden avatar Feb 04 '23 18:02 bsbodden

hi @bsbodden, Gson 2.10 Support for serializing and deserializing Java records, on Java ≥ 16. so maybe we can update the version of gson to support record serializing and deserializing

yangtao-manoo avatar Apr 09 '23 02:04 yangtao-manoo