0

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.

user2135533
  • 181
  • 1
  • 2
  • 11
  • 1
    Would you mind sharing the definition of your `Singer` class and the `Singers` table? It seems that it tries to convert a `ByteArray` column to a `String`. Is that intentional? – Knut Olav Løite Jul 26 '23 at 19:56
  • Yes, you are right. There is a column of type BYTES which it is trying to convert to String. – user2135533 Jul 26 '23 at 20:24
  • I even tried by implemented BeanPostProcessor to override postProcessAfterInitialization inorder to get GenericConversionService bean and added the coverter. But it is still not available during conversion. – user2135533 Jul 26 '23 at 20:27

1 Answers1

1

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.

user2135533
  • 181
  • 1
  • 2
  • 11