【问题标题】:Spring Data MongoDb - how to use "findAll" method which return only valid documentsSpring Data MongoDb - 如何使用仅返回有效文档的“findAll”方法
【发布时间】:2022-04-17 19:00:30
【问题描述】:

我使用 Spring data mongo 作为 ORM 来访问我的 MongoDb。 我需要阅读一个 MongoDb 集合,其中包含我不管理内容及其有效性的文档。 而且我面临一个问题:文档并非全部有效,当我使用“findAll”方法时,我只是捕获了一个异常。而不是这种行为,我想找到所有有效的文件并拒绝无效的文件。

例如,我有一个带有原始布尔值的 bean,并且在文档中,该字段设置为 String 类型。所以当我使用“findAll”时,我现在得到一个例外,但我想要所有有效文件的列表。 我的意思是,由于类型错误,我的集合中的某些文档无效 - 无法转换为 bean Java 类型。我只是使用了一个布尔示例,但它也可以与 int、long、所有原始 Java 类型一起出现。 Spring data mongo 有办法做到这一点吗?

非常感谢,

这里是堆栈:

java.lang.IllegalStateException:无法执行 CommandLineRunner 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 在 hello.Application.main(Application.java:38) [classes/:na] 引起:java.lang.NullPointerException:null 在 hello.Customer_Accessor_sbf1mo.setProperty(Unknown Source) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:58) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:290) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:278) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:330) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:278) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:238) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:198) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:194) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:85) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2313) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1966) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1784) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1767) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:641) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:359) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:197) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll(SimpleMongoRepository.java:51) ~[spring-data-mongodb-1.10.3.RELEASE.jar:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111] 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:504) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:489) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-1.13.3.RELEASE.jar:na] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.8.RELEASE.jar:4.3.8.RELEASE] 在 com.sun.proxy.$Proxy43.findAll(Unknown Source) ~[na:na] 在 hello.Application.run(Application.java:58) [classes/:na] 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] ...省略了6个常用框架

【问题讨论】:

  • 请添加异常堆栈跟踪

标签: spring mongodb validation document


【解决方案1】:

您可以使用仅返回有效数据的WHERE 子句创建自定义查询。

为此,您必须以这种方式创建一个ObjectRepositoryCustom.java 接口:

@Repository
public interface ObjectRepositoryCustom {

    //Where "o.field" is the field you have to check to decide if it's valid or not
    @Query("SELECT o FROM Object o WHERE o.field = somethingThatValidsIt")
    public List<Object> customFindAll();

}

然后你进入你的ObjectRepository.java并以这种方式添加extends ObjectRepositoryCustom

//import your custom repository here
@Repository
public interface ObjectRepository extends JpaRepository<Object,Long>, ObjectRepositoryCustom {

}

注意,我使用“Object”类型是因为我不知道你的班级名称。

然后你可以像这样调用你的查询方法。

private final ObjectRepository objectRepository;
List<Object> result = objectRepository.customFindAll();

希望对你有帮助!

【讨论】:

  • 感谢您的回答,抱歉,我的问题不清楚。当我说“有效文档”时,它是针对可以由 Spring Data Mongo 加载的文档。我的意思是,由于类型错误,我的集合中的某些文档无效 - 无法转换为 bean Java 类型。我只是使用了一个布尔示例,但它也可以与 int、long、所有原始 Java 类型一起出现。如何拒绝所有错误的文档(由于错误的数据类型)并仅加载有效的文档?
【解决方案2】:

感谢您在上面的所有消息。

我找到了一种简单而可靠的方法(当我要求 findAll 查询时拒绝无效文档)。

下面的示例带有一个名为 Customer 的 bean。

DBCollection collection = mongoTemplate.getCollection("customer");
DBCursor cursor = collection.find();
while (cursor.hasNext()) { 
  DBObject obj = cursor.next();
  try {
    Customer instance = mongoTemplate.getConverter().read(Customer.class, obj);  
    // We have now the Customer instance 
  } catch(Exception exception) {
    System.err.println("ERROR: Cannot convert to Customer this DBObject " + obj);
  }
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多