找不到能够从 org.bson.BsonUndefined 类型转换的转换器

Dip*_*ani 5 java mongodb spring-data-mongodb

我有 mongo 驱动程序 3.2.2,spring 数据 mongodb 1.9.1.RELEASE。

收藏 :

{
  "_id": "5728a1a5abdb9c352cda6432",
  "isDeleted": null,
  "name": undefined
},
{
  "_id": "5728a1a5abdb9c352cda6433",
  "isDeleted": null,
  "name": null
}
Run Code Online (Sandbox Code Playgroud)

当我尝试获取记录时,出现{"name":undefined}以下异常。

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type org.bson.BsonUndefined to type java.lang.String
    at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313) ~[spring-core-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~[spring-core-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:176) ~[spring-core-4.1.7.RELEASE.jar:4.1.7.RELEASE]
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getPotentiallyConvertedSimpleRead(MappingMongoConverter.java:821) ~[spring-data-mongodb-1.7.1.RELEASE.jar:?]
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?我有多种类型需要从 BsonUndefined 转换,如字符串、日期、电话号码等......

Bri*_*ian 4

我们最近遇到了这个问题,所以我将我的研究结果放在这里,以防其他人也遇到这个问题。

这是 Spring Data MongoDB 中的一个已知错误:

https://jira.spring.io/browse/DATAMONGO-1439

该链接的解决方法是添加一个显式转换器,用于从 转换BsonUndefinednull。例如,使用 Java 8:

@ReadingConverter
public class BsonUndefinedToNullObjectConverterFactory implements ConverterFactory<BsonUndefined, Object> {
    @Override
    public <T extends Object> Converter<BsonUndefined, T> getConverter(Class<T> targetType) {
        return o -> null;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有 Lambda(Java 8 之前的版本):

@ReadingConverter
public class BsonUndefinedToNullObjectConverterFactory implements ConverterFactory<BsonUndefined, Object> {

    @Override
    public <T extends Object> Converter<BsonUndefined, T> getConverter(Class<T> targetType) {
        return new Converter<BsonUndefined, T>() {
            @Override
            public T convert(BsonUndefined source) {
                return null;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)