【问题标题】:spring data mongodb converter弹簧数据mongodb转换器
【发布时间】:2014-03-18 11:51:04
【问题描述】:

我正在使用 Spring Data mongo-db 1.4.1.RELEASE。

我的实体“事件”有一个基于其他属性计算的 getter 方法:

 public int getStatus() {
      return (getMainEventId() == null) ?  (elapseTimeInMin() < MINIMUM_TIME ? CANDIDATE : 
       VALID) : POINTER;
      }   

我希望属性“状态”仅通过 getter 保持,所以我编写了转换器:

 @WritingConverter
    public class EventWriteConverter implements Converter<Event ,BasicDBObject > {



    static final Logger logger = LoggerFactory.getLogger(EventWriteConverter.class.getCanonicalName());

    public BasicDBObject convert(Event event) {

        logger.info("converting " +event );

        if (event.getMainEventId() != null)
            return new BasicDBObject("mainEventId", event.getMainEventId() );

        BasicDBObject doc = new BasicDBObject("status",event.getStatus()).
                append("updated_date",new Date()).
                append("start",event.getS0()).
                append("end",event.getS1()).
                append("location",event.getLocation()).

                ;

        BasicDBList list = new BasicDBList();


        doc.append("access_points",event.getHotPoints());

        return doc;
    }

    @ReadingConverter
    public class EventReadConverter implements Converter<BasicDBObject, Event> {

    @Inject
    HotPointRepositry hotRepositry;

    static final Logger logger = LoggerFactory.getLogger(EventReadConverter.class.getCanonicalName());

    public Event convert(BasicDBObject doc) {

        logger.info(" converting ");
        Event event = new Event();

        event.setId(doc.getObjectId("_id"));
        event.setS0(doc.getDate("start"));
        event.setS1(doc.getDate("end"));
        BasicDBList dblist = (BasicDBList) doc.get("hot_points");
        if (dblist != null) {

            for (Object obj : dblist) {

                ObjectId hotspotId = ((BasicDBObject) obj).getObjectId("_id");
                event.addHot(hotRepositry.findOne(hotId));
            }
        }
        dblist = (BasicDBList) doc.get("devices");
        if (dblist != null) {
            for (Object obj : dblist)
                event.addDevice(obj.toString());
        }



        event.setMainEventId(doc.getObjectId("mainEventId"));

        return event;

     }

    }

我的测试mongo配置是

@Profile("test")
@Configuration
@EnableMongoRepositories(basePackages = "com.echo.spring.data.mongo")
@ComponentScan(basePackages = "com.echo.spring.data.mongo" )
public class MongoDbTestConfig extends AbstractMongoConfiguration {


    static final Logger logger = LoggerFactory.getLogger(MongoDbTestConfig.class.getCanonicalName());
    @Override
    protected String getDatabaseName() {
        return "echo";
    }

    @Override
    public Mongo mongo() {
        return new Fongo("echo-test").getMongo();
    }

    @Override
    protected String getMappingBasePackage() {
        return "com.echo.spring.data.mongo";
    }
    @Bean
    @Override
    public CustomConversions customConversions() {
        logger.info("loading custom converters");
        List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
        converterList.add(new EventReadConverter());
        converterList.add(new EventWriteConverter());
        CustomConversions cus = new CustomConversions(converterList);

        return new CustomConversions(converterList);
    }
    }

我的测试(使用 fongo)是

ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MongoDbTestConfig.class  )
public class SampleMongoApplicationTests {

 @Test
@ShouldMatchDataSet(location = "/MongoJsonData/events.json")
public void shouldSaveEvent() throws IOException {

    URL url = Resources.getResource("MongoJsonData/events.json");
    List<String> lines = Resources.readLines(url,Charsets.UTF_8);

    for (String line : lines) {
        Event event =   objectMapper.readValue(line.getBytes(),Event.class);
        eventRepository.save(event);
    }

}

我可以看到调用配置 customConversions() 时加载了转换器 我在转换方法中添加了日志记录和断点,但它们似乎不是 在我运行或调试时调用,尽管它们已加载。

我做错了什么?

【问题讨论】:

  • 您好,我遇到的问题与您完全相同...我正在通过 spring-boot 使用 mongo-db 1.4.2.RELEASE。它根本不起作用......
  • 有人解决了这个问题吗?

标签: mongodb spring-data


【解决方案1】:

我也有类似情况,关注Spring -Mongodb storing/retrieving enums as int not string 我需要连接转换器和转换器工厂才能使其正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2021-04-25
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多