google-code-export / morphia

Automatically exported from code.google.com/p/morphia
1 stars 0 forks source link

Need converter for java.sql.Time #409

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
There is no converter for java.sql.Time datatype.
The Time object is not stored as mongodb date type:
{ "_id" : ObjectId("4fbf273ce3d733a48442b1b2"), "className" : "db.mongodb.Aa", 
"time" : { "fastTime" : NumberLong("1337927484422") } }
And can't be retrieved ( see stacktrace below).

What version are you using? (Morphia/Driver/MongoDB)
0.99.1
Please include a stack trace below:
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: 
java.lang.RuntimeException: com.google.code.morphia.mapping.MappingException: 
No usable constructor for java.sql.Time
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:523)
    at com.google.code.morphia.mapping.Mapper.fromDBObject(Mapper.java:272)
    at com.google.code.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:66)
    at com.google.code.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:53)
    at com.google.code.morphia.query.MorphiaIterator.next(MorphiaIterator.java:48)
    at com.google.code.morphia.query.QueryImpl.get(QueryImpl.java:368)
    at com.google.code.morphia.DatastoreImpl.get(DatastoreImpl.java:532)
    at com.bytemobile.fusion.ems.db.mongodb.MongoDbAccessServiceImpl.retrieveById(MongoDbAccessServiceImpl.java:576)
    ... 3 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: 
com.google.code.morphia.mapping.MappingException: No usable constructor for 
java.sql.Time
    at com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:149)
    at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:543)
    at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:520)
    ... 10 more
Caused by: java.lang.RuntimeException: 
com.google.code.morphia.mapping.MappingException: No usable constructor for 
java.sql.Time
    at com.google.code.morphia.mapping.DefaultCreator.createInst(DefaultCreator.java:123)
    at com.google.code.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:31)
    at com.google.code.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:41)
    at com.google.code.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:52)
    at com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:139)
    ... 12 more
Caused by: com.google.code.morphia.mapping.MappingException: No usable 
constructor for java.sql.Time
    at com.google.code.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:146)
    at com.google.code.morphia.mapping.DefaultCreator.createInst(DefaultCreator.java:121)
    ... 16 more
Caused by: java.lang.NoSuchMethodException: java.sql.Time.<init>()
    at java.lang.Class.getConstructor0(Class.java:2706)
    at java.lang.Class.getDeclaredConstructor(Class.java:1985)
    at com.google.code.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:142)
    ... 17 more

Original issue reported on code.google.com by baowe...@gmail.com on 25 May 2012 at 7:29

GoogleCodeExporter commented 9 years ago
You can use a custom converter for java.sql.Date. To do this simply annotate 
your entity class with @Converters({MyDateConverter.class})
I wrote two Date converters for you, the first one stores the date as a long 
value, the second one as a java.util.Date value. Take the one which fits your 
need.

-- Date as Long

public final class DateConverter extends TypeConverter implements 
SimpleValueConverter {

    public DateConverter() {
        super(Date.class);
    }

    @Override
    public Object encode(Object value, MappedField optionalExtraInfo) {
        return ((Date)value).getTime();
    }

    @Override
    public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo)
            throws MappingException {
        if (fromDBObject == null) {
            return null;
        }
        return new Date((Long) fromDBObject);
    }
}

-- Date as java.util.Date

public final class DateConverter extends TypeConverter implements 
SimpleValueConverter {

    public DateConverter() {
        super(Date.class);
    }

    @Override
    public Object encode(Object value, MappedField optionalExtraInfo) {
        return new java.util.Date(((Date)value).getTime());
    }

    @Override
    public Object decode(Class targetClass, Object fromDBObject, MappedField optionalExtraInfo) throws MappingException {
        if (fromDBObject == null) {
            return null;
        }
        return new Date(((java.util.Date)fromDBObject).getTime());
    }
}

Original comment by sebastia...@otto.de on 9 Jul 2012 at 8:42

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
Can you put the imports for those types and give an example of how to use 
@Converters?

Original comment by kall.pi...@gmail.com on 12 Jul 2013 at 2:34