2012-12-08 7 views
17

Bahar-veri-MongoDB ile özel bir dönüştürücü kullanmaya çalışıyorum. Ben programlı oluşturmak istiyor, ancak aşağıdaki hatayı alıyorum:Seti mongodb dönüştürücü programlı

class LocalDateReadConverter implements Converter<String, LocalDate> { 
    @Override 
    public LocalDate convert(String s) { 
     // Conversion code omitted. 
    } 
} 

class LocalDateWriteConverter implements Converter<LocalDate, String> { 

    @Override 
    public String convert(LocalDate localDate) { 
     // Conversion code omitted. 
    } 
} 

:

Mongo mongo = new Mongo(); 
    MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo, "database"); 

    List<Converter> converters = new ArrayList<>(); 
    converters.add(new LocalDateWriteConverter()); 
    converters.add(new LocalDateReadConverter()); 
    CustomConversions customConversions = new CustomConversions(converters); 

    MappingContext mappingContext = new SimpleMongoMappingContext(); 
    MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(mongoDbFactory, mappingContext); 
    mappingMongoConverter.setCustomConversions(customConversions); 

    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, mappingMongoConverter); 

    MongoDbEvent mongoEvent = new MongoDbEvent(new LocalDate(2012, 12, 8)); 
    mongoTemplate.insert(mongoEvent); 

Ve işte benim dönüştürücü sınıfları şunlardır:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of  converting from type org.joda.time.LocalDate to type java.lang.String 
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:475) 
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175) 
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:154) 
.... 
.... 

aşağıdaki

başarısız kod parçacığı olduğunu Ben inat çalışıyorum sınıf şuna benzer:

import org.joda.time.LocalDate; 

public class MongoDbEvent { 

    private String id; 
    private LocalDate date; 

    public MongoDbEvent(LocalDate date) { 
     this.date = date; 
    } 

    public String getId() { 
     return id; 
    } 

    public LocalDate getDate() { 
     return date; 
    } 

    @Override 
    public String toString() { 
     return "MongoDbEvent{" + 
       "id='" + id + '\'' + 
       ", date=" + date + 
       '}'; 
     } 
} 

cevap

18

Bu cevap geç OP için biraz olabilir, ama ben sadece bugün aynı sorunla karşılaştık ve bir çözüm ...

sen kullanmadan önce MongoMappingConverter.afterPropertiesSet() çağırmanız gerekir, programlı kurmak için bulundu. Bunu, MongoTemplate.getDefaultMongoConverter(MongoDbFactory) kodunu okuyarak fark ettim. Yeni pakette yeni LOCALDATE ve LocalDateTime sınıflarını kullanarak benzer bir sorun koştum java 8'de java.time paketinin tanıtılmasıyla

MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory, context); 
converter.setTypeMapper(mapper); 
converter.setCustomConversions(new CustomConversions(
     Arrays.asList(
       new TimeZoneReadConverter(), 
       new TimeZoneWriteConverter() 
     ) 
)); 
converter.afterPropertiesSet(); 
MongoTemplate template = new MongoTemplate(mongoDbFactory, converter); 
+0

Sonunda Bunu test getirmiştim özel dönüştürücüler ile MongoTemplate nasıl oluşturulacağını, ve işe yaradı kusursuzca. Çok teşekkürler! – Daniel

+1

Çok teşekkür ederim! '.afterPropertiesSet()' yi gördüğüm gibi, 'spring-data'nın birim testlerinde ona yeterince ilgi göstermedim ... – Zarathustra

+0

Bu gerçekten bana zaman kazandırdı, teşekkürler! : D – ArcanisCz

0

:

İşte bir örnek. Bu ben onu çözdüm nasıl:

  • DateToLocalDateTimeConverter İşte
  • DateToLocalDateConverter
  • LocalDateTimeToDateConverter
  • LocalDateToDateConverter

: Ben bu dönüşüm tüm seçenekleri 4 için bir dönüştürücü yazdı

bir örnek

public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { 

    @Override 
    public LocalDateTime convert(Date source) { 
     return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault()); 
    } 
} 

Sonra MongoDB ile java 8 tarihlerini iş başardı mongodb bağlantısı için xml yapılandırmasına bu dahil ederek (tüm dönüştürücüleri eklemeyi unutmayın):

<mongo:mapping-converter> 
    <mongo:custom-converters> 
     <mongo:converter> 
      <bean class="package.DateToLocalDateTimeConverter" /> 
     </mongo:converter> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 
11

Sadece biraz daha dikkatli olmam . Java Yapılandırması'nı kullanarak bu sorunla spring-data-mongodb 1.5.1.RELEASE'da mücadele ediyordum. Bazı sınıflar değiştikçe, çözümümü gönderiyorum.

@Configuration ile açıklamalı yapılandırma sınıfında şu tanımı ekleyin:

@Bean 
public Mongo mongo() throws Exception { 
    MongoPropertiesResolver resolver = mongoResolver(); 
    return new MongoClient(resolver.getUrl()); 
} 

@Bean 
public MongoDbFactory mongoDbFactory() throws Exception { 
    return new SimpleMongoDbFactory(mongo(), "database"); 
} 

@Bean 
public MongoTemplate mongoTemplate() throws Exception { 
    return new MongoTemplate(mongoDbFactory(), mongoConverter()); 
} 

@Bean 
public CustomConversions customConversions() { 
    List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>(); 
    converters.add(new TimeZoneReadConverter()); 
    converters.add(new TimeZoneReadConverter()); 
    return new CustomConversions(converters); 
} 

@Bean 
public MappingMongoConverter mongoConverter() throws Exception { 
    MongoMappingContext mappingContext = new MongoMappingContext(); 
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory()); 
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mappingContext); 
    mongoConverter.setCustomConversions(customConversions()); 
    return mongoConverter; 
} 
özel dönüştürücüler ile mongo özelleştirmek için detaylı olarak burada alman nasıl
+3

'mongoResolver() işlevi nereden geliyor? –

+1

Yapıcı SimpleMongoDbFactory (Mongo, String) kullanımdan kaldırıldı - Spring Boot 1.3.2 kullanıyorum –

+0

Kod örneği için teşekkürler, Fongo kullanarak bazı birim testlerini bir araya getirmeye çalışırken bazı özel dönüştürücüler oluşturmama yardımcı oldu. –

2

: Varsayılan yapılandırmayı enjekte

http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mapping-configuration

değerler böylece application.properties yapılandırma ayarlarından yararlanabilir.

@Configuration 
    public class MongoConfiguration extends AbstractMongoConfiguration { 
    @Value("${spring.data.mongodb.database:test}") 
    String database; 

    @Value("${spring.data.mongodb.host:localhost}:${spring.data.mongodb.port:27017}") 
    String host; 

    @Override 
    protected String getDatabaseName() { 
     return database; 
    } 

    @Override 
    public Mongo mongo() throws Exception { 
     return new MongoClient(host); 
    } 

    @Bean 
    @Override 
    public CustomConversions customConversions() { 
     List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>(); 
     converterList.add(new MongoColorWriter()); 
     converterList.add(new MongoColorReader()); 
     return new CustomConversions(converterList); 
    } 
    } 
+0

Paylaşılan bağlantı yardımcı oldu. –

0

org.springframework.data:spring-data-commons:1.13.3.RELEASE beri burada programlı

public MongoTemplate mongoTemplate(String mongoUri) throws Exception { 
    MongoDbFactory factory = new SimpleMongoDbFactory(new MongoClientURI(mongoUri)); 
    CustomConversions conversions = new CustomConversions(
      Arrays.asList(new FooWriteConverter(), new FooReadConverter())); 
    MongoMappingContext mappingContext = new MongoMappingContext(); 
    DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); 
    MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mappingContext); 
    mongoConverter.setCustomConversions(conversions); 
    mongoConverter.afterPropertiesSet(); 
    return new MongoTemplate(factory, mongoConverter); 
} 

dönüştürücüleri (uygulama atlanmış)

class FooWriteConverter implements Converter<Foo, DBObject> { ... } 
class FooReadConverter implements Converter<DBObject, Foo> { ... }