2012-12-08 35 views
17

Tôi đang cố gắng sử dụng bộ chuyển đổi tùy chỉnh với spring-data-mongodb. Tôi muốn tạo ra nó lập trình, nhưng tôi nhận được lỗi sau:Đặt bộ chuyển đổi MongoDb theo chương trình

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) 
.... 
.... 

Sau đây là đoạn mã thất bại:

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); 

Và đây là lớp học chuyển đổi của tôi:

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. 
    } 
} 

Lớp tôi đang cố gắng tồn tại trông như sau:

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 + 
       '}'; 
     } 
} 

Trả lời

18

Câu trả lời này có thể hơi muộn cho OP, nhưng tôi chỉ gặp phải vấn đề tương tự hôm nay và tìm ra giải pháp ...

Để thiết lập theo chương trình, bạn cần gọi MongoMappingConverter.afterPropertiesSet() trước khi sử dụng. Tôi nhận ra điều này từ việc đọc mã cho MongoTemplate.getDefaultMongoConverter(MongoDbFactory).

Dưới đây là một ví dụ:

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

cuối cùng tôi nhận được xung quanh để kiểm tra điều này, và nó làm việc hoàn hảo. Cảm ơn nhiều! – Daniel

+1

Cảm ơn bạn rất nhiều! Khi tôi thấy '.afterPropertiesSet();' trong các bài kiểm tra đơn vị của dữ liệu mùa xuân, tôi đã không chú ý đủ đến nó ... – Zarathustra

+0

Điều này thực sự giúp tôi tiết kiệm thời gian, cảm ơn! : D – ArcanisCz

0

Với sự ra đời của gói java.time trong java 8 Tôi chạy vào một vấn đề tương tự bằng cách sử dụng các lớp học LOCALDATE và LocalDateTime mới trong gói mới. Đây là cách tôi giải quyết nó:

Tôi đã viết một chuyển đổi cho tất cả 4 các tùy chọn chuyển đổi:

  • DateToLocalDateTimeConverter
  • DateToLocalDateConverter
  • LocalDateTimeToDateConverter
  • LocalDateToDateConverter

đây là ví dụ

public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> { 

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

Sau đó, bằng cách bao gồm này trong cấu hình xml cho kết nối MongoDB tôi đã có thể làm việc trong java 8 ngày với MongoDB (nhớ để thêm tất cả các bộ chuyển đổi):

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

Chỉ cần một người đứng đầu lên . Tôi đã đấu tranh với vấn đề đó trên spring-data-mongodb 1.5.1.RELEASE bằng cách sử dụng Cấu hình Java. Vì một số lớp đã thay đổi, tôi đăng giải pháp của mình.

Thêm định nghĩa sau đây trong lớp cấu hình chú thích với @Configuration:

@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; 
} 
+3

'MongoResolver() 'xuất phát từ đâu? –

+1

Hàm khởi tạo SimpleMongoDbFactory (Mongo, String) không được dùng nữa - Tôi đang sử dụng Spring Boot 1.3.2 –

+0

Cảm ơn ví dụ mã, điều này đã giúp tôi thiết lập một số trình biến đổi tùy chỉnh khi cố gắng kết hợp một số xét nghiệm đơn vị bằng Fongo. –

2

Làm thế nào để tùy chỉnh Mongo với bộ chuyển đổi tùy chỉnh được decribed đây một cách chi tiết:

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

tôi tiêm cấu hình mặc định các giá trị để tôi có thể hưởng lợi từ cài đặt cấu hình application.properties.

@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

Liên kết được chia sẻ hữu ích. –

0

Kể từ org.springframework.data:spring-data-commons:1.13.3.RELEASE, dưới đây là cách để lập trình tạo ra một MongoTemplate với bộ chuyển đổi tùy chỉnh

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); 
} 

Các bộ chuyển đổi (thực hiện bỏ qua)

class FooWriteConverter implements Converter<Foo, DBObject> { ... } 
class FooReadConverter implements Converter<DBObject, Foo> { ... } 
Các vấn đề liên quan