2014-05-21 26 views
0

我已經使用SpringData創建了一個簡單的項目'mongoDB'來讀寫MongoDB。該項目按預期工作。現在,當我嘗試將項目集成到另一個現有獨立Java項目時,我看到一個異常。 進一步調試問題,我在單機Java應用程序異常雖然使用MongoDB服務使用Spring

mongo = new MongoClient("xx.xx.xx.xx"); 
SimpleMongoDbFactory simpleMongoDbFactory = new SimpleMongoDbFactory(mongo, "MongoDBName"); 

也不例外添加的這兩行代碼,到目前爲止,但是當我添加下面的線,我得到一個異常。

MongoTemplate mongoTemplate = new MongoTemplate(mongo, "MongoDBName"); 

有誰能告訴我爲什麼我看到這個錯誤?我可以在不使用SpringData的情況下使用它。使用

罐:從應用程序日誌文件

mongo-java-driver-2.11.1.jar, spring-data-mongodb-1.2.1.RELEASE.jar, spring-data-commons-1.5.1.RELEASE.jar, spring-tx-4.0.2.RELEASE.jar, cglib-2.2.2.jar 

異常堆棧跟蹤:

java.lang.NullPointerException 
      at org.springframework.core.SerializableTypeWrapper$TypeProxyInvocationHandler.invoke(SerializableTypeWrapper.java:239) 
      at org.springframework.core.$Proxy0.hashCode(Unknown Source) 
      at org.springframework.util.ObjectUtils.nullSafeHashCode(ObjectUtils.java:273) 
      at org.springframework.core.ResolvableType.hashCode(ResolvableType.java:779) 
      at org.springframework.util.ConcurrentReferenceHashMap.getHash(ConcurrentReferenceHashMap.java:214) 
      at org.springframework.util.ConcurrentReferenceHashMap.getReference(ConcurrentReferenceHashMap.java:246) 
      at org.springframework.util.ConcurrentReferenceHashMap.get(ConcurrentReferenceHashMap.java:226) 
      at org.springframework.core.ResolvableType.forType(ResolvableType.java:1154) 
      at org.springframework.core.ResolvableType.forType(ResolvableType.java:1133) 
      at org.springframework.core.ResolvableType.forTypes(ResolvableType.java:812) 
      at org.springframework.core.ResolvableType.getInterfaces(ResolvableType.java:388) 
      at org.springframework.core.ResolvableType.as(ResolvableType.java:350) 
      at org.springframework.core.convert.support.GenericConversionService.getRequiredTypeInfo(GenericConversionService.java:266) 
      at org.springframework.core.convert.support.GenericConversionService.addConverterFactory(GenericConversionService.java:103) 
      at org.springframework.core.convert.support.DefaultConversionService.addScalarConverters(DefaultConversionService.java:79) 
      at org.springframework.core.convert.support.DefaultConversionService.addDefaultConverters(DefaultConversionService.java:63) 
      at org.springframework.core.convert.support.DefaultConversionService.<init>(DefaultConversionService.java:50) 
      at org.springframework.core.convert.support.ConversionServiceFactory.createDefaultConversionService(ConversionServiceFactory.java:69) 
      at org.springframework.data.mongodb.core.convert.MappingMongoConverter.<init>(MappingMongoConverter.java:100) 
      at org.springframework.data.mongodb.core.MongoTemplate.getDefaultMongoConverter(MongoTemplate.java:1692) 
      at org.springframework.data.mongodb.core.MongoTemplate.<init>(MongoTemplate.java:189) 
      at org.springframework.data.mongodb.core.MongoTemplate.<init>(MongoTemplate.java:154) 
      at com.rccl.promotions.processor.AbstractPromotionProcessor.process(AbstractPromotionProcessor.java:92) 
      at com.rccl.promotions.processor.MessageProcessor.process(MessageProcessor.java:73) 
      at com.rccl.promotions.messageadapter.processor.MessageProcessorTest.testGetVoyageBestRatePromotion_step1(MessageProcessorTest.java:66) 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:76) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
      at java.lang.reflect.Method.invoke(Method.java:607) 
      at junit.framework.TestCase.runTest(TestCase.java:168) 
      at junit.framework.TestCase.runBare(TestCase.java:134) 
      at junit.framework.TestResult$1.protect(TestResult.java:110) 
      at junit.framework.TestResult.runProtected(TestResult.java:128) 
      at junit.framework.TestResult.run(TestResult.java:113) 
      at junit.framework.TestCase.run(TestCase.java:124) 
      at junit.framework.TestSuite.runTest(TestSuite.java:232) 
      at junit.framework.TestSuite.run(TestSuite.java:227) 
      at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRun`enter code here`ner.java:467) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

回答

0

檢查您的Spring應用程序上下文爲方便起見,你可以使用他們的蒙戈相關的命名空間支持:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
    xsi:schemaLocation="http://www.springframework.org/schema/data/mongo 
     http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <mongo:mongo id="mongo" host="127.0.0.1" port="27017" /> 
    <mongo:db-factory id="mongoDbFactory" mongo-ref="mongo" dbname="MongoDBName" /> 

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
     <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    </bean> 

    <mongo:repositories base-package="path.to.your.repository.packages"/> 

</beans> 

您可以在上查看我已經設置好的例子。

+0

感謝您的回覆Vlad。我使用Spring註釋來管理bean管理。我不明白的是爲什麼這個異常被觸發。 – arcot

0

發生這種情況是因爲你的項目同時具有3.0版本和4.0+版本作爲依賴項(因爲這兩個版本有不同的工件名稱,是的,兩者可以共存!)。兩個版本都有這個類'ObjectUtils.java',但是它們的'nullSafeHashCode'方法有不同的實現!

利用Spring 2.x和4.x的春天作爲例子: 在V2,

public static int nullSafeHashCode(Object obj) { 
    if (obj == null) { 
     return 0; 
    } 
    if (obj.getClass().isArray()) { 
     if (obj instanceof Object[]) { 
      return nullSafeHashCode((Object[]) obj); 
     } 
     if (obj instanceof boolean[]) { 
      return nullSafeHashCode((boolean[]) obj); 
     } 
     if (obj instanceof byte[]) { 
      return nullSafeHashCode((byte[]) obj); 
     } 
     if (obj instanceof char[]) { 
      return nullSafeHashCode((char[]) obj); 
     } 
     if (obj instanceof double[]) { 
      return nullSafeHashCode((double[]) obj); 
     } 
     if (obj instanceof float[]) { 
      return nullSafeHashCode((float[]) obj); 
     } 
     if (obj instanceof int[]) { 
      return nullSafeHashCode((int[]) obj); 
     } 
     if (obj instanceof long[]) { 
      return nullSafeHashCode((long[]) obj); 
     } 
     if (obj instanceof short[]) { 
      return nullSafeHashCode((short[]) obj); 
     } 
    } 
    return obj.hashCode(); // The problem comes from here 
} 

而在V4,

public static boolean nullSafeEquals(Object o1, Object o2) { 
    if (o1 == o2) { 
     return true; 
    } 
    if (o1 == null || o2 == null) { 
     return false; 
    } 
    if (o1.equals(o2)) { 
     return true; 
    } 
    if (o1.getClass().isArray() && o2.getClass().isArray()) { 
     if (o1 instanceof Object[] && o2 instanceof Object[]) { 
      return Arrays.equals((Object[]) o1, (Object[]) o2); 
     } 
     if (o1 instanceof boolean[] && o2 instanceof boolean[]) { 
      return Arrays.equals((boolean[]) o1, (boolean[]) o2); 
     } 
     if (o1 instanceof byte[] && o2 instanceof byte[]) { 
      return Arrays.equals((byte[]) o1, (byte[]) o2); 
     } 
     if (o1 instanceof char[] && o2 instanceof char[]) { 
      return Arrays.equals((char[]) o1, (char[]) o2); 
     } 
     if (o1 instanceof double[] && o2 instanceof double[]) { 
      return Arrays.equals((double[]) o1, (double[]) o2); 
     } 
     if (o1 instanceof float[] && o2 instanceof float[]) { 
      return Arrays.equals((float[]) o1, (float[]) o2); 
     } 
     if (o1 instanceof int[] && o2 instanceof int[]) { 
      return Arrays.equals((int[]) o1, (int[]) o2); 
     } 
     if (o1 instanceof long[] && o2 instanceof long[]) { 
      return Arrays.equals((long[]) o1, (long[]) o2); 
     } 
     if (o1 instanceof short[] && o2 instanceof short[]) { 
      return Arrays.equals((short[]) o1, (short[]) o2); 
     } 
    } 
    return false; 
} 

在彈簧數據的MongoDB,它應該使用v4在類路徑中,但實際上,JVM會錯誤地加載v2。使用mvn依賴關係:樹來檢查所有潛在的依賴關係。