2017-06-30 2 views
1

J'utilise Spring data mongo comme ORM pour accéder à mon MongoDb. Je dois lire une collection MongoDb contenant des documents dont je ne gère pas le contenu et sa validité. Et je suis confronté à un problème: les documents ne sont pas tous valides et quand j'utilise la méthode 'findAll', j'attrape juste une exception. Au lieu de ce comportement, je voudrais trouver tous les documents valides et rejeter les invalides. Par exemple, j'ai un bean avec un booléen primitif et dans le document, ce champ est défini sur un type de chaîne. Donc, quand j'utilise 'findAll', je reçois une exception pour l'instant, mais j'aimerais avoir la liste de tous les documents valides. Ce que je veux dire, c'est que certains documents de ma collection ne sont pas valides en raison d'un mauvais type - ne peuvent pas être castés dans le type Java bean. J'utilise juste un exemple booléen mais il peut aussi apparaître avec int, long, tous les types Java primitifs. Il y a un moyen de le faire avec Spring data mongo? Impossible d'exécuter CommandLineRunner à org.springframework.boot.SpringApplication.callRunner (SpringApplication.java:779):Spring Data MongoDb - comment utiliser la méthode "findAll" qui retourne uniquement les documents valides

Un grand merci,

Voici le Stace de la pile:

java.lang.IllegalStateException [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.RE LEASE.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] Causé par: java.lang.NullPointerException : null at hello.Customer_Accessor_sbf1mo.setProperty (source inconnue) ~ [spring-data-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty (ConvertingPropertyAccessor.java : 58) ~ [printemps-données-communes-1.13.3.RELEASE.j ar: na] à org.springframework.data.mongodb.core.convert.MappingMongoConverter $ 1.doWithPersistentProperty (MappingMongoConverter.java:290) ~ [ressort-data-mongodb-1.10.3.RELEASE.jar: na] à org .springframework.data.mongodb.core.convert.MappingMongoConverter $ 1.doWithPersistentProperty (MappingMongoConverter.java:278) ~ [ressort-data-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data.mapping. model.BasicPersistentEntity.doWithProperties (BasicPersistentEntity.java:330) ~ [ressort-données-communes-1.13.3.RELEASE.jar: na] à org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (MappingMongoConverter. java: 278) ~ [ressort-données-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (MappingMongoConverter.java:238) ~ [printemps- data-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data.mongodb.core.convert.MappingMongoConverter.read (MappingMongoConverter.java:198) ~ [ressort-data-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data. mongodb.core.convert.MappingMongoConverter.read (MappingMongoConverter.java:194) ~ [ressort-données-mongodb-1.10.3.RELEASE.jar: na] à org.springframework.data.mongodb.core.convert.MappingMongoConverter. read (MappingMongoConverter.java:85) ~ [ressort-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) ~ [ressort-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) ~ [printemps- data-mongodb-1.10.3.RELEASE.jar: na] à l'adresse org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll (SimpleMongoRepository.java:359) ~ [spring-data-mongodb-1.10.3. RELEASE.jar: na] sur org.springframework.data.mongodb.repository.support.SimpleMongoRepository.findAll (Simp leMongoRepository.java:197) ~ [ressort-données-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 (Méthode native) ~ [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. procéder (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] à l'adresse 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) ~ [ressort-données-communes-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-anop -4.3.8.RELEASE.jar: 4.3.8. RELEASE] à com.sun.proxy. $ Proxy43.findAll (source inconnue) ~ [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 images courantes omises

+0

S'il vous plaît ajouter la trace de la pile d'exception –

Répondre

0

Vous pouvez créer une requête personnalisée avec WHERE clause qui renvoie uniquement des données valides.

Pour ce faire, vous devez créer une interface ObjectRepositoryCustom.java de cette façon:

@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(); 

} 

Ensuite, vous allez dans votre ObjectRepository.java et ajoutez extends ObjectRepositoryCustom ainsi:

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

} 

Remarque, je " Objet "Tapez parce que je ne connais pas le nom de votre classe.

Ensuite, vous pouvez appeler votre méthode de requête comme ceci.

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

J'espère que ça aide!

+0

Merci pour votre réponse, Désolé, je n'étais pas clair sur ma question. Quand je dis 'document valide', il s'agit d'un document qui peut être chargé par Spring Data Mongo. Ce que je veux dire, c'est que certains documents de ma collection ne sont pas valides en raison d'un mauvais type - ne peuvent pas être castés dans le type Java bean. J'utilise juste un exemple booléen mais il peut aussi apparaître avec int, long, tous les types Java primitifs. Comment puis-je rejeter tous les mauvais documents (en raison d'un mauvais type de données) et ne charger que les documents valides? –

0

findAll, comme son nom l'indique pour l'extraction de tous les documents de la collection. Je ne pense pas qu'il y ait moyen au niveau du référentiel de limiter les documents par champ valide.

Pour obtenir des documents valides, vous pouvez utiliser la variante findBy dans votre référentiel. Vous pouvez utiliser le code ci-dessous en supposant que vous avez la configuration suivante en fonction de votre publication.

document

{ "_id" : "1", "valid" : "true" } 

Pojo

@Document(collection = "collectionname") 
public class SomeBean { 

    private String id; 

    private boolean valid; 

    //getters and setters 
} 

dépôt

@Repository 
public interface SomeBeanRepository extends MongoRepository<SomeBean, String> { 

    List<SomeBean> findByValid(String valid); 

} 

Appel classe

List<SomeBean> data = someBeanRepository.findByValid("true"); 
+0

Un grand merci pour votre réponse. Désolé, je n'étais pas clair sur ma question. Quand je dis 'document valide', il s'agit d'un document qui peut être chargé par Spring Data Mongo. Ce que je veux dire, c'est que certains documents de ma collection ne sont pas valides en raison d'un mauvais type - ne peuvent pas être castés dans le type Java bean. J'utilise juste un exemple booléen mais il peut aussi apparaître avec int, long, tous les types Java primitifs. Comment puis-je rejeter tous les mauvais documents (en raison d'un mauvais type de données) et ne charger que les documents valides? –

+0

Np. Les données Spring fonctionnent avec la vérification de type. Vous pouvez utiliser le pilote java natif avec typesafe 'BsonDocument' et vérifier le type' while (iterator.hasNext()) { BsonDocument obj = iterator.next(); Valeur BsonValue = obj.get ("valide"); if (value.isBoolean()) { someBean.setValid (value.asBoolean()); } } ' – Veeram

0

Merci pour tous vos messages ci-dessus.

Je trouve une manière simple et robuste de le faire (rejeter un document invalide lorsque je demande une requête findAll).

Un exemple ci-dessous avec un bean nommé Customer.

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); 
    } 
} 

J'espère que cela pourrait aider!