groovy 未找到转换器异常:未找到能够从类型[org. bson. types. Binary]转换为类型[java. util. UUID]的转换器

rjee0c15  于 2023-02-03  发布在  Java
关注(0)|答案(1)|浏览(211)

我有一个小型的标准Sping Boot 微服务,它是针对一个Mongo DB集合的Spring Data REST。该文档包含UUID字段。由于需求,该集合是一个有上限的集合。
现在我可以在我的机器上本地构建和运行应用程序,这没有问题。但是,我们在生产环境中运行Docker中的所有内容。包含服务的容器构建没有任何问题,但一旦启动,就会出现以下错误:

{"timestamp":"2023-01-13T15:10:01.592Z","message":"Servlet.service()
 for servlet [dispatcherServlet] in context with path [] threw exception
 [Request processing failed; nested exception is
 org.springframework.core.convert.ConverterNotFoundException:
 No converter found capable of converting from type [org.bson.types.Binary]
 to type [java.util.UUID]] with root cause", 
 "component":"org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]",
 "level":"ERROR","stack_trace":
 "org.springframework.core.convert.ConverterNotFoundException:
 No converter found capable of converting from type [org.bson.types.Binary]
 to type [java.util.UUID]
at org.springframework.core.convert.support.GenericConversionService
           .handleConverterNotFound(GenericConversionService.java:322)
...
at org.springframework.data.mongodb.core.convert.MappingMongoConverter
           .doConvert(MappingMongoConverter.java:1826)
...
at org.springframework.data.mongodb.repository.support.SimpleMongoRepository
           .findAll(SimpleMongoRepository.java:444)

其实我有几个问题:
1.基本上,如何处理它?是否可以使用Spring配置来处理?
1.为什么在应用程序启动期间调用SimpleMongoRepository.findAll()?
1.我们有几个Mongo DB的应用程序--它们都很好。Spring Data REST在这方面有什么问题吗?
1.为什么构建正常,但是当容器启动时失败了?
代码示例和服务一样位于Groovy上(默认情况下所有内容都是公共的)。

@RepositoryRestResource( collectionResourceRel = 'events', path = 'events' )
interface EventRepository extends MongoRepository<EventMessage, String> { }

收集配置如下所示

class CustomApplicationRunner implements ApplicationRunner {

    @Autowired
    MongoTemplate mongoTemplate

    @Autowired
    ApplicationProperties configuration

    @Override
    void run(ApplicationArguments args) throws Exception {
        mongoTemplate.writeResultChecking = WriteResultChecking.EXCEPTION
        if ( !mongoTemplate.collectionExists( EventMessage ) ) {
            mongoTemplate.createCollection(EventMessage, new CollectionOptions(
                    configuration.mongoCollectionMaxSizeBytes,
                    configuration.mongoCollectionMaxDocuments,
                    configuration.mongoCappedCollection )
            )
        }
    }
}

在application.yml中,mongo配置是(在开发端)

mongodb:
      uri: mongodb://mongodb:27017/development
      auto-index-creation: true
      uuid-representation: STANDARD
      authentication-database: admin

Sping Boot 依赖项包括

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-amqp'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    implementation 'org.springframework.boot:spring-boot-starter-integration'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-rest'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

版本:Spring引导2.7.7,Groovy 4.0.6
我做了一点调查。
Here是Mongo DB驱动程序支持二进制和BsonBinary的UUID转换的JIRA问题。然而,只有BsonBinary被更新,显然它没有被使用。
Here是Spring Data MongoDB针对相同问题(或非常接近我的问题)的问题。作者提供了解决方案,但我不知道这是否是唯一的方法。我想联系作者了解更多细节,但他们从那时起就不活跃了。
我可以从上面实现解决方案,但我想弄清楚到底是怎么回事。谢谢大家提前!

hiz5n14c

hiz5n14c1#

进一步研究这个问题,我意外地找到了一个解决办法.
有Sping Boot Starter Spring Integration依赖项。但是,服务中没有使用任何来自Spring Integration的东西。
还有Jackson2JsonObjectMapper bean被定义了,但是没有在任何地方使用。很可能是服务早期阶段的遗留物。这里我应该注意到,有问题的数据类是由@JsonDeserializer注解的,带有正确工作的特定反序列化器类。
因此,删除bean和SpringIntegration依赖项可以解决这个问题。

相关问题