尝试使用Spring Spanner数据的SpannerTemplate进行SQL查询时获取ConverterNotFoundException

ldioqlga  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(73)

我使用JavaSpringboot连接到SpannerDB,使用SpannerTemplate遵循query-modify中提供的步骤。
我在例外之下

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]

字符串
我可以使用

this.spannerTemplate.insert(singer);


但是在使用时获取异常

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


我尝试通过实现接口来编写CustomConvertor

Converter<ByteArray, String>


并注册了

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


我尝试的另一种方法是实现org.springframework.core.convert.converter.GenericConverter,并以下面的方式注册它

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


任何提供的指针来解决这个问题都将是有帮助的。

rjzwgtxy

rjzwgtxy1#

虽然我无法找到添加转换器的方法。我在Knut Olav的注解的帮助下修复了这个问题
我将Singer类中属性的类型从String更改为ByteArray,我认为这是正确的方法。

相关问题