2014-01-08 59 views
1

我在使用spring-data-mongodb 1.3.3.RELEASE和Java 1.6時遇到了一些麻煩。Spring Data MongoDB忽略_class信息

我的設置有點複雜,因爲我必須處理遺留數據,所以我有一個自定義的TypeMapper(擴展DefaultMongoTypeMapper)和兩個不同的讀/寫轉換器組合。此外,我使用@TypeAlias來設置數據庫中的_class信息。

有問題的機型包括幾個嵌套列表,有些類型的像

List<DocumentValue> 

爲MyObject可能包含一個對象列表

List<Object> 

可能包含另一個DocumentValue對象。

此設置似乎工作,單元測試運行沒有任何問題,對象映射看起來相當不錯的調試器。我的應用程序是一個Web應用程序,我可以將DocumentValue寫入一個集合,信息存在_class

只要我不關閉服務器(在我的情況下是一個tomcat),對象映射的作品。但是,當我重新啓動服務器(啓動新的JVM)時,DocumentValue對象未正確映射,但被視爲java.util.Map_class信息似乎被忽略。我想我的映射上下文可能有問題(我的模型實體是否應該在Spring Context啓動時註冊?),但我無法找到錯誤配置。有沒有人有類似的問題或有一些建議?

回答

1

感謝您的回覆。我想我找到了爲什麼_class被忽略的原因。你是對的,我使用了TypeMapper的不尋常組合。

讓我告訴你我的CustomTypeMapper:

public class CustomTypeMapper extends DefaultMongoTypeMapper { 

    public CustomTypeMapper (MongoMappingContext mappingContext) { 

     super(DEFAULT_TYPE_KEY, 
       Arrays.asList(new MappingContextTypeInformationMapper(
         mappingContext))); 
    } 

    @Override 
    public <T> TypeInformation<? extends T> readType(DBObject source, 
      TypeInformation<T> basicType) { 

     // do some custom recognition 

       // or just to the common type mapping 
     return super.readType(source, basicType); 

    } 
} 

除了常見的類型識別特殊的一點是,其中MappingContextTypeInformationMapper用於使用@TypeAlias註釋構造函數。

這裏的關鍵是需要的MongoMappongContext。在非功能性的情況下,我初始化CustomTypeMapper像

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper"> 
    <constructor-arg name="mappingContext"> 
     <bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" /> 
    </constructor-arg> 
</bean> 

這工作,但錯了,因爲MongoMappingContext的新實例並沒有包含在

<mongo:mapping-converter id="customMappingConverter" db-factory-ref="mongoDbFactory" 
     type-mapper-ref="customTypeMapper" base-package="de.flexguse.model" > 

    <mongo:custom-converters> 
      ... some custom converters ... 
    </mongo:custom-converters> 

</mongo:mapping-converter> 
通過設置基礎包屬性提供的任何TypeInformation

不幸的是,我無法弄清楚MongoMappingContext的創建地點是否可以用作構造函數參數,所以我發明了一個簡單的MongoMappingContextProvider,它使用@Autowire獲取MongoMappingContext

public class MongoMappingContextProvider { 

    @Autowired 
    private MongoMappingContext mappingContext; 

    /** 
    * @return the mappingContext 
    */ 
    public MongoMappingContext getMappingContext() { 
     return mappingContext; 
    } 

} 

的CustomTypeMapper的Spring的配置現在看起來是這樣

<bean id="mongoMappingContextProvider" class="de.flexguse.repository.MongoMappingContextProvider" /> 

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper"> 
    <constructor-arg name="mappingContext" value="#{mongoMappingContextProvider.mappingContext}" /> 
</bean> 

該解決方案爲我工作。

順便說一句,就一定要對我用我加@Document到這是堅持每一個模型都豆模型bean所有TypeInformations - 以防萬一;)

也許這是別人有幫助的類似的問題。

問候, 克里斯托夫

0

我懷疑這個問題是由於TypeMapper使用和轉換器的不尋常的組合。 如果註冊了一個特定類型的手動實現的Converter實例,那麼Converter負責創建一個持久化並且可以在MongoDB中讀寫的對象。這意味着你的轉換器實例本身需要寫入類型信息。

如果您無法使用它並可編譯一個小例子項目來重現問題(最好是要執行的測試用例),請隨時在我們的JIRA實例中提交一張票。

+0

這裏的問題類似於http://stackoverflow.com/questions/22538256/java-isassignablefrom-not-working-post-hot-deploy。你可以看一下嗎? – Jaga

相關問題