2014-09-30 15 views
11

Ho dati di primavera mongo convertitori personalizzati di installazione tramite XML come segueprimavera dati mongodb: convertitore di accesso predefinito POJO da dentro convertitore personalizzato

<mongo:mapping-converter id="mongoConverter" db-factory-ref="mongoDbFactory"> 
    <mongo:custom-converters> 
     <mongo:converter ref="customWriteConverter" /> 
     <mongo:converter ref="customReadConverter" /> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 

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

<bean id="customWriteConverter" class="package.WriteConverter" /> 
<bean id="customReadConverter" class="package.ReadConverter" /> 

Nel convertitore/scrittura personalizzati leggere, vorrei riutilizzo di primavera -Data-mongo's convertitore pojo predefinito per salvare determinate proprietà come documenti secondari.

considerano un esempio semplificato -

class A { 
    B b; 
    String var1; 
    int var2; 
} 

class B { 
    String var3; 
    String var4; 
} 

voglio gestire la conversione di classe A con customWriteConverter e customReadConverter, ma nei miei convertitori personalizzati Voglio anche delegare la conversione di classe B torna in Primavera-data-Mongo di convertitore POJO predefinito.

Come posso fare questo? Non sono stato in grado di autowire con successo un MongoConverter o MongoTemplate nel convertitore personalizzato poiché la creazione del bean MongoConverter/MongoTemplate è in corso quando tenta di creare il convertitore personalizzato. È possibile accedere al convertitore predefinito e utilizzarlo dall'interno del convertitore personalizzato?

+0

hai trovato una soluzione per questo? – jacob

+0

@jacob - no, la mia classe da serializzare è stata fortunatamente piccola, quindi ho appena finito di scrivere un convertitore personalizzato per questo. – ashutosh

+0

Hai estratto [questa domanda] (http://stackoverflow.com/questions/13780692/set-mongodb-converter-programatically)? Credo che questo ti aiuterà a usare i tuoi convertitori personalizzati –

risposta

3

Questo metodo viene utilizzato nella classe MongoTemplate per ottenere un convertitore predefinito.

private static final MongoConverter getDefaultMongoConverter(MongoDbFactory factory) { 
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); 
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, new MongoMappingContext()); 
    converter.afterPropertiesSet(); 
    return converter; 
} 

MappingMongoConverter non è finale e quindi possono essere ignorate per uno scopo specifico. Come menzionato nel mio commento sopra, guarda su this question per scoprire la soluzione al tuo problema.

+0

Mentre è privato, mi mostra come farlo. Grazie! –

+1

Se sto capendo correttamente, dovrei chiamare questo metodo statico dal mio convertitore personalizzato. Ma come faccio a ricevere una MongoDbFactory dal mio convertitore personalizzato per passarla a questo metodo statico? – ashutosh

2

Se si esegue la conversione mongo database e vuole di default alcune conversioni, si potrebbe fare qualcosa di simile:

... 

    @Resource 
    private ObjectFactory<MappingMongoConverter> 
     mappingMongoConverterObjectFactory; 

    private MappingMongoConverter 
     mappingMongoConverter; 

    ... 

    //Otherwise, use default MappingMongoConverter 
    // 
    if (result == null) 
     result = 
      getMappingMongoConverter() 
       .convertToMongoType(
        value 
       ); 

    ... 

    MappingMongoConverter getMappingMongoConverter() { 
     if (mappingMongoConverter == null) 
      mappingMongoConverter = 
       mappingMongoConverterObjectFactory.getObject(); 
     return 
      mappingMongoConverter; 
    } 

Il MappingMongoConverter non può essere direttamente @Resource (a cura di), nel mio caso dal momento che è nel processo di essere costruito quando altri convertitori sono in costruzione. Quindi, Spring rileva un riferimento circolare. Non sono sicuro che esista un metodo "pigro" migliore per fare ciò senza il rinculo di ObjectFactory, del metodo getter e del caching.

Ora, se qualcuno è in grado di trovare un metodo di default per l'elaborazione standard mentre si torna indietro (da DBObject a java Object) completa questa cerchia.

+0

Se si conosce il tipo di destinazione, allora FROM è: result = getMappingMongoConverter(). Read (targetType, dbObject); – pbatey

0

Prova per iniettare BeanFactory nel convertitore e nel metodo di convertire prendere mongoTemplate da BeanFactory ...