복붙노트

[MONGODB] 설정 MongoDB의 프로그래밍 컨버터

MONGODB

설정 MongoDB의 프로그래밍 컨버터

나는 스프링 데이터 MongoDB를 함께 사용자 지정 변환기를 사용하려고 해요. 내가 프로그램을 만들려면, 그러나 나는 다음과 같은 오류가 발생합니다 :

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

다음은 실패 코드입니다 :

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

그리고 여기 내 컨버터 클래스는 다음과 같습니다

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

클래스는이 같은 모습을 유지하기 위해 노력하고있어 :

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

해결법

  1. ==============================

    1.이 답변은 늦게까지 영업을위한 작은 수 있지만 난 그냥 오늘 같은 문제로 실행하고 해결책을 발견 ...

    이 답변은 늦게까지 영업을위한 작은 수 있지만 난 그냥 오늘 같은 문제로 실행하고 해결책을 발견 ...

    프로그래밍 방식으로 설정하려면, 당신은 당신이 그것을 사용하기 전에) MongoMappingConverter.afterPropertiesSet을 (호출해야합니다. 나는 MongoTemplate.getDefaultMongoConverter (MongoDbFactory)에 대한 코드를 읽고 이것을 깨달았다.

    다음은 그 예이다 :

    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);
    
  2. ==============================

    2.그냥 머리까지. 나는 스프링 데이터 MongoDB를 1.5.1.RELEASEusing 자바 구성에 그 문제로 어려움을 겪고 있었다. 일부 클래스가 변경, 나는 내 솔루션을 게시하도록하겠습니다.

    그냥 머리까지. 나는 스프링 데이터 MongoDB를 1.5.1.RELEASEusing 자바 구성에 그 문제로 어려움을 겪고 있었다. 일부 클래스가 변경, 나는 내 솔루션을 게시하도록하겠습니다.

    @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. ==============================

    3.어떻게 여기에 상세하게 설명되어 사용자 정의 컨버터 MongoDB를을 사용자 정의 할 수 :

    어떻게 여기에 상세하게 설명되어 사용자 정의 컨버터 MongoDB를을 사용자 정의 할 수 :

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

    내가 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);
        }
      }
    
  4. ==============================

    4.새로운 패키지의 새로운 LOCALDATE 및 LocalDateTime 클래스를 사용하여 유사한 문제에 자바 (8) I 달렸다의 java.time 패키지의 도입. 나는 그것을 해결하는 방법입니다 :

    새로운 패키지의 새로운 LOCALDATE 및 LocalDateTime 클래스를 사용하여 유사한 문제에 자바 (8) I 달렸다의 java.time 패키지의 도입. 나는 그것을 해결하는 방법입니다 :

    나는이 변환 옵션의 모든 4 변환기를 썼다 :

    다음 예는

    public class DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> {
    
        @Override 
        public LocalDateTime convert(Date source) { 
            return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault()); 
        }
    }
    

    그럼 난 MongoDB를 함께 자바에서 8 날짜를 작업 할 수 있었다 MongoDB의 연결을위한 XML 구성이를 포함하여 (모든 컨버터를 추가해야합니다) :

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

    5.org.springframework.data:spring-data-commons:1.13.3.RELEASE 때문에, 여기에 프로그램 사용자 지정 컨버터와 MongoTemplate을 만드는 방법

    org.springframework.data:spring-data-commons:1.13.3.RELEASE 때문에, 여기에 프로그램 사용자 지정 컨버터와 MongoTemplate을 만드는 방법

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

    (실시 생략) 변환기

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

    6.나를 위해 대신 작가의 독자로 내 계산기를 등록했다. 당신이 당신의 컨버터 클래스에 @WritingConverter 주석을 추가 할 필요가 있음을 해결하려면

    나를 위해 대신 작가의 독자로 내 계산기를 등록했다. 당신이 당신의 컨버터 클래스에 @WritingConverter 주석을 추가 할 필요가 있음을 해결하려면

    @Component
    @WritingConverter
    public class NoteWriterConverter implements Converter<Note, DBObject> {
    
    @Override
    public DBObject convert(Note source) {
        DBObject obj = new BasicDBObject();
    
        obj.put("title", source.getTitle());
        obj.put("reviewDate", source.getReviewDate());
    
        obj.removeField("_class");
        return obj;
        }
    }
    
  7. from https://stackoverflow.com/questions/13780692/set-mongodb-converter-programmatically by cc-by-sa and MIT license