我的应用程序中有一个自定义类,该类抛出未找到的编解码器。我正在使用GORM + MongoDB。
我尝试了文档中指定的方法。
自定义编解码器 GORM for MongoDB建立在MongoDB的BSON编码框架之上。这意味着可以实现自定义编解码器,以对BSON和从BSON进行值的编码和解码。
例如,考虑以下简单的Groovy类:
class Birthday {
Date date
}
默认情况下,编码引擎不知道如何将这种类型表示为BSON值。为了使编码引擎理解这种类型,您必须实现自定义编解码器:
import org.bson.*
import org.bson.codecs.*
class BirthdayCodec implements Codec<Birthday> {
Birthday decode(BsonReader reader, DecoderContext decoderContext) {
return new Birthday(date: new Date(reader.readDateTime()))
}
void encode(BsonWriter writer, Birthday value, EncoderContext encoderContext) {
writer.writeDateTime(value.date.time)
}
Class<Birthday> getEncoderClass() { Birthday }
}
从BsonReader解码Birthday类型 将Birthday类型编码为BsonWriter 返回要编码的类型。在这种情况下,生日。 完成之后,您需要注册自定义编解码器。有两种方法可以实现。
您可以在application.yml的grails.mongodb.codecs设置中注册编解码器列表:
grails:
mongodb:
codecs:
- my.company.MoneyCodec
或者您可以创建一个META-INF / services / org.bson.codecs.Codec文件,其中包含Codec的完全限定的类名。如果要注册多个编解码器类,请将每个编解码器放在单独的行上。 //我为我的Money Object编写的编解码器类
class MoneyCodec implements Codec<Money> {
Money decode(BsonReader reader, DecoderContext decoderContext) {
return new Money(currency: reader.String())
}
void encode(BsonWriter writer, Money value, EncoderContext encoderContext) {
writer.writeString(value.amount)
}
Class<Money> getEncoderClass() { Money }
}
}
Stacktrace:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'my.company.MoneyCodec@3bf1b79b' with class 'my.company.MoneyCodec' to class 'org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec'
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:414)
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:328)
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:242)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:615)
at org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec.encodeEmbeddedCollectionUpdate(PersistentEntityCodec.groovy:396)
at org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec.encodeUpdate(PersistentEntityCodec.groovy:254)
at org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec.encodeEmbeddedCollectionUpdate(PersistentEntityCodec.groovy:372)
at org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec.encodeUpdate(PersistentEntityCodec.groovy:254)
at org.grails.datastore.mapping.mongo.engine.codecs.PersistentEntityCodec.encodeUpdate(PersistentEntityCodec.groovy)
at org.grails.datastore.mapping.mongo.MongoCodecSession.flush(MongoCodecSession.groovy:158)
at org.grails.datastore.mapping.mongo.AbstractMongoSession.flush(AbstractMongoSession.java:74)
at org.grails.datastore.mapping.transactions.DatastoreTransactionManager.doCommit(DatastoreTransactionManager.java:168)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:152)
at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)