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

"findBy...Between..()", findBy..GreaterThanEqual() etc. Methods throw NoSuchMethodError

Open AnujaK opened this issue 1 year ago • 6 comments

Redis-om-spring version 0.6.0

As an extension to the example of Search on Redis Hashes(in this repo), I added a long field 'startUTC' that is indexed. None of the findBy methods work - findByStartUTCBetween() , findByStartUTCGreaterThanEqual(), findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual() work. On using FT.SEARCH on the same index with the due params gives correct result for all of them. The stack trace on searching using OM is as follows:

java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()' at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3] at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.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.redis.om.spring.repository.query.RedisEnhancedQuery.executeQuery(RedisEnhancedQuery.java:354) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.execute(RedisEnhancedQuery.java:269) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138) ~[spring-data-commons-2.6.3.jar:2.6.3] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.18.jar:5.3.18] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.18.jar:5.3.18] at jdk.proxy3/jdk.proxy3.$Proxy85.findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual(Unknown Source) ~[na:na]

AnujaK avatar Sep 30 '22 09:09 AnujaK

@AnujaK can you provide a code sample, I just tried it with a long field on a @RedisHash mapping and a between query like:

Model:

package com.redis.om.spring.annotations.hash.fixtures;

import java.util.HashSet;
import java.util.Set;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

import com.redis.om.spring.annotations.AutoComplete;
import com.redis.om.spring.annotations.Bloom;
import com.redis.om.spring.annotations.Indexed;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@Data
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@RedisHash("people")
public class Person {

  @Id 
  String id;
  
  @NonNull 
  String name;
  
  @NonNull
  @Indexed
  Long numberOfPets; // The long being indexed
  
  @NonNull 
  @AutoComplete 
  @Bloom(name = "bf_person_email", capacity = 100000, errorRate = 0.001)
  String email;
  
  @NonNull
  @Bloom(capacity = 100000, errorRate = 0.001)
  String nickname;
  
  @NonNull
  @Indexed
  Set<String> roles = new HashSet<String>();
  
  @NonNull
  Set<String> favoriteFoods = new HashSet<String>();
}

Repository:

@Repository
public interface PersonRepository extends RedisEnhancedRepository<Person, String>, EmailTaken {
  
  // find by numeric property range
  Iterable<Person> findByNumberOfPetsBetween(long nopGT, long nopLT);
}

That works just fine.

bsbodden avatar Oct 04 '22 07:10 bsbodden

Thanks Brian.My classes look pretty similar. Not able to figure out what's different or wrong!

@Data
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor
@RedisHash
public class Call {
  @Id 
  private String id;
  
  @Indexed @NonNull
  private long insertUTC;
  
  @NonNull
  private String sessionId;
  
  @Indexed  @NonNull
  private long startUTC;
  
  @Searchable @NonNull
  private long queryNo;
  
  @Indexed @NonNull
  private String controlPolicy;
  
  @NonNull
  private String callStatus;
  
  @NonNull
  private long purgeUTC;
  
  // audit fields
  
  @CreatedDate
  private Date createdDate;
}

Repo:

  @Repository 
public interface CallRepository extends CrudRepository<Call, String> {
  
  List<Call> findByControlPolicy(String policy);
  
  Iterable<Call> search(String policy);
  // Tried returning Iterable instead of List as well; Same error for the methods below
  List<Call> findByQueryNoContainingIgnoreCase(String mobile);

  List<Call> findByStartUTCGreaterThanEqualAndStartUTCLessThanEqual(long startTime, long endTime);
  
  List<Call> findByStartUTCBetween(long startTime, long endTime);
  
  List<Call> findByStartUTCGreaterThanEqual( long startTime);
  
}

AnujaK avatar Oct 04 '22 10:10 AnujaK

@AnujaK it could be the startUTC with all caps for UTC is causing an issue, can you try startUtc and report back?

bsbodden avatar Oct 04 '22 15:10 bsbodden

I changed startUTC to startUtc and recreated the DB. I continue to get:

java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()'
	at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3]
	at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na]
	at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na]
	at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na]
	at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.0.jar:na]
	...

The command line query works fine: FT.SEARCH com.redis.om.hashes.domain.CallIdx "@startUtc:[1665035502 1665035503]"

AnujaK avatar Oct 06 '22 04:10 AnujaK

Can you post the repository code and the full model and I’ll debug it on my end, a ZIp or a link to a repo will do the trick.

On Thu, Oct 6, 2022 at 6:37 AM Anuja Kumar @.***> wrote:

I changed startUTC to startUtc and recreated the DB. I continue to get:

java.lang.NoSuchMethodError: 'org.springframework.data.mapping.InstanceCreatorMetadata org.springframework.data.redis.core.mapping.RedisPersistentEntity.getInstanceCreatorMetadata()' at com.redis.om.spring.convert.MappingRedisOMConverter.lambda$doReadInternal$0(MappingRedisOMConverter.java:198) ~[redis-om-spring-0.6.0.jar:na] at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:360) ~[spring-data-commons-2.6.3.jar:2.6.3] at com.redis.om.spring.convert.MappingRedisOMConverter.doReadInternal(MappingRedisOMConverter.java:196) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.convert.MappingRedisOMConverter.read(MappingRedisOMConverter.java:142) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.util.ObjectUtils.documentToObject(ObjectUtils.java:236) ~[redis-om-spring-0.6.0.jar:na] at com.redis.om.spring.repository.query.RedisEnhancedQuery.lambda$executeQuery$5(RedisEnhancedQuery.java:353) ~[redis-om-spring-0.6.0.jar:na] ...

The command line query works fine: FT.SEARCH com.redis.om.hashes.domain.CallIdx @.***:[1665035502 1665035503]"

— Reply to this email directly, view it on GitHub https://github.com/redis/redis-om-spring/issues/112#issuecomment-1269300290, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAF4LIO7T6SDYSZUFQEAVTWBZJQRANCNFSM6AAAAAAQZTXAJM . You are receiving this because you were assigned.Message ID: @.***>

-- Cheers, Brian https://integrallis.com

bsbodden avatar Oct 06 '22 16:10 bsbodden

Redis-OM.zip Java version: Openjdk 17.0.2

AnujaK avatar Oct 07 '22 09:10 AnujaK

@AnujaK The problem was mismatched version of Spring in the POM. I updated those and pushed a working copy to https://github.com/bsbodden/issue-112

bsbodden avatar Oct 25 '22 23:10 bsbodden

Hey thanks @bsbodden , the fix works great!

AnujaK avatar Oct 26 '22 14:10 AnujaK