Getting ConverterNotFoundException when trying to make SQL Queries using Spring Spanner data's SpannerTemplate

143 views Asked by At

I'm using Java Springboot to connect to Spanner DB using SpannerTemplate following the steps provided in query-modify.

I'm getting below exception

Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [com.google.cloud.ByteArray] to type [java.lang.String]
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322) ~[spring-core-5.3.27.jar:5.3.27]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~[spring-core-5.3.27.jar:5.3.27]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175) ~[spring-core-5.3.27.jar:5.3.27]
at com.google.cloud.spring.data.spanner.core.convert.SpannerCustomConverter.convert(SpannerCustomConverter.java:67) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.convert.StructPropertyValueProvider.convertOrRead(StructPropertyValueProvider.java:144) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.convert.StructPropertyValueProvider.readSingleWithConversion(StructPropertyValueProvider.java:120) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.convert.StructPropertyValueProvider.getPropertyValue(StructPropertyValueProvider.java:96) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.convert.ConverterAwareMappingSpannerEntityReader.lambda$read$0(ConverterAwareMappingSpannerEntityReader.java:110) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:368) ~[spring-data-commons-2.7.11.jar:2.7.11]
at com.google.cloud.spring.data.spanner.core.convert.ConverterAwareMappingSpannerEntityReader.read(ConverterAwareMappingSpannerEntityReader.java:90) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.convert.ConverterAwareMappingSpannerEntityProcessor.mapToList(ConverterAwareMappingSpannerEntityProcessor.java:82) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.SpannerTemplate.mapToListAndResolveChildren(SpannerTemplate.java:649) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.SpannerTemplate.queryAndResolveChildren(SpannerTemplate.java:636) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.google.cloud.spring.data.spanner.core.SpannerTemplate.query(SpannerTemplate.java:258) ~[spring-cloud-gcp-data-spanner-3.5.5.jar:3.5.5]
at com.example.spanner.SpannerAppRunner.readRecords(SpannerAppRunner.java:32) ~[classes/:na]
at com.example.spanner.SpannerAppRunner.run(SpannerAppRunner.java:28) ~[classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:759) ~[spring-boot-2.7.11.jar:2.7.11]

I'm able to insert the records using the

this.spannerTemplate.insert(singer);

but getting the exception when using

 List<Singer> allSingers = this.spannerTemplate
        .query(Singer.class, Statement.of("SELECT * FROM Singers"),
                new SpannerQueryOptions().setAllowPartialRead(true));

I tried writing CustomConvertor by implementing the interface

Converter<ByteArray, String>

and registered it

@Bean
public Converter<ByteArray, String> customConvertor() {
   return new CustomConvertor();
}

Another way I tried was implementing org.springframework.core.convert.converter.GenericConverter and register it by in below fashion

@Bean
public ConversionService conversionService() {
    GenericConversionService service = new GenericConversionService();
    GcpStringGenericConverter converter = new GcpStringGenericConverter();
    service.addConverter(converter);
    return service;
}

Any pointer provided to fix this would be helpful.

1

There are 1 answers

0
user2135533 On

Though I was unable to find a way to add a converter. I fixed this issue with the help of the comment from Knut Olav

I changed the type of the attribute in Singer class from String to ByteArray and I think it is the right way.