1

I am using spring data mongo-db 1.4.1.RELEASE.

My entity 'Event' has a getter method which is calculated based on other properties:

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

I wanted the property 'status' to be persisted only through the getter ,so I wrote converters:

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

     }

    }

My test mongo configuration is

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

And my test (using fongo) is

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

}

I can see the converters are loaded when the configuration customConversions() is called I added logging and breakpoints in the convert methods but they do not seems to be called when I run or debug, though they are loaded .

What am I doing wrong ?

  • Hi, I have exactly the same problem than you... If you fixed It would be really helpful if you explain how. I am using mongo-db 1.4.2.RELEASE through spring-boot. It simply does not work... – Dani C. May 15 '14 at 23:15
  • Did anyone get this fixed? – Benten Sep 06 '16 at 17:30

1 Answers1

0

I had a similar situation, I followed Spring -Mongodb storing/retrieving enums as int not string and I need both the converter AND converterFactory wired to get it working.

Community
  • 1
  • 1
clai
  • 306
  • 1
  • 3