Translate

lunes, 18 de junio de 2012

Spring JPA MongoDB: java.lang.NoSuchMethodError: com.mysema.query.mongodb.MongodbQuery

En nuestros proyecto estamos estamos trabajando con Spring Data Jpa para MySql y para MongoDb.

Al hora de hacer una query en MongoDb utilizando QueryDSL para utilizar los predicado que facilitan la creación de queries, nos ha dado el siguiente error.


------
java.lang.NoSuchMethodError: com.mysema.query.mongodb.MongodbQuery.<init>(Lcom/mongodb/DBCollection;Lcom/google/common/base/Function;Lcom/mysema/query/mongodb/MongodbSerializer;)V
 at org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery.<init>(SpringDataMongodbQuery.java:58)
 at org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery.<init>(SpringDataMongodbQuery.java:44)
 at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.createQueryFor(QueryDslMongoRepository.java:167)
 at org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.count(QueryDslMongoRepository.java:154)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:334)
 at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:319)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
----- 
El código utilizado el el siguiente:

 
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;

import charris.example.domain.Product;

public interface ProductRepository extends MongoRepository<Product, String>, QueryDslPredicateExecutor<Product> {

}



El error proviene al hacer una query como esta:

 
ProductRepository repo = context.getBean(ProductRepository.class);
Product p = repo.findOne(QProduct.product.name.eq("ProductName"));



El problema consistía en un problema de versiones entre los jar de
  1. querydl-mongodb
  2. spring-data
El error se solucionó poniendo las versiones  adecuadas de los JAR. Nosotros tuvimos que recurrir a los Nightly builds de spring data para que funcionara perfectamente.

Las versiones de los Jars fueron las siguientes a fecha (18/06/2012)

  •  querydsl-mongodb-2.5.0.jar
  • querydsl-mongodb-2.5.0-apt.jar
  • querydsl-mongodb-2.5.0-apt-one-jar.jar
  • spring-data-commons-core-1.3.2.BUILD-20120618.140513-1.jar
  • spring-data-jpa-1.1.1.BUILD-20120606.192912-1.jar
  • spring-data-mongodb-1.1.0.BUILD-20120614.104654-40.jar

No hay comentarios:

Publicar un comentario