2016-03-31 2 views
0

一括書き込み中に発生する問題のため、私は自分のプロジェクトのMorphia jarをアップグレードしようとしています。morphia MappingException:コンバータ(IdentityConverter)からのエラー設定値

モルフィア0.99から1.1.1。更新後、Iterableを実装したEmbeddedクラスオブジェクトを読み込み中に問題が発生しています。

java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: コンバータからのエラー設定値(IdentityConverter)

続きを読みながら、私は見ていますとエラーになり、レコードを持続

私はMongo 2.7.3を使用していますが、現時点ではアップグレードできません。

EDIT:フルスタックトレース:

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: Error setting value from converter (IdentityConverter) for Doc.expressionTraversalTree to { "levels" : [ { "computeUnits" : [ { "computeType" : "MATH_EVAL" , "mvalExpression" : "doc['__count__'].value + 10" }] , "level" : 0}]} 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:74) 
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:772) 
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:230) 
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:191) 
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134) 
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146) 
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117) 
    at org.mongodb.morphia.query.QueryImpl.get(QueryImpl.java:220) 
    at org.mongodb.morphia.dao.BasicDAO.findOne(BasicDAO.java:188) 
    . 
    . 
    . 
Caused by: java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: Error setting value from converter (IdentityConverter) for Doc.expressionTraversalTree to { "levels" : [ { "computeUnits" : [ { "computeType" : "MATH_EVAL" , "mvalExpression" : "doc['__count__'].value + 10" }] , "level" : 0}]} 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:74) 
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:768) 
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:230) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:206) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.readCollection(EmbeddedMapper.java:142) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:45) 
    ... 14 more 
Caused by: org.mongodb.morphia.mapping.MappingException: Error setting value from converter (IdentityConverter) for Doc.expressionTraversalTree to { "levels" : [ { "computeUnits" : [ { "computeType" : "MATH_EVAL" , "mvalExpression" : "doc['__count__'].value + 10" , "computeLevel" : 0 , "applyFilter" : false }] , "level" : 0}]} 
    at org.mongodb.morphia.converters.Converters.fromDBObject(Converters.java:128) 
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:56) 
    ... 19 more 
Caused by: java.lang.IllegalArgumentException: Can not set ComputeExpTraversalTree field Doc.expressionTraversalTree to com.mongodb.BasicDBObject 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) 
    at java.lang.reflect.Field.set(Field.java:741) 
    at org.mongodb.morphia.mapping.MappedField.setFieldValue(MappedField.java:410) 
    at org.mongodb.morphia.converters.Converters.fromDBObject(Converters.java:126) 
    ... 20 more 
+0

実際のスタックトレースを確認するのに役立ちます。見ることに役立つ「原因」セクションがしばしばあります。 – evanchooly

+0

@evanchoolyスタックトレースを追加しました。確認してください。 –

答えて

0

は、問題を修正しました。誰かを助けるかもしれないので、答えとして掲示する。

根本原因は、オブジェクトフィールド 'ComputeExpTraversalTree'であり、MorphiaはこのオブジェクトをMongoのBasicDBObjectに変換できませんでした。

フィールドをエンコードしてデコードするカスタムコンバータをBasicDBObjectから&に追加しました。

変換のスニペットとこれをMorphiaクライアントで設定する方法。

Converterクラス:

public class ComputeExpressionTreeConverter extends TypeConverter implements SimpleValueConverter { 

    public ComputeExpressionTreeConverter() { 
     super(ComputeExpTraversalTree.class); 
    } 

    @Override 
    public Object encode(Object value, MappedField optionalExtraInfo) { 
     if (value == null) { 
      return null; 
     } 
     DBObject dbo = null; 
     String expressionTree=new Gson().toJson(
       value, ComputeExpTraversalTree.class); 
     dbo=BasicDBObject.parse(expressionTree); 
     return dbo; 
    } 

    @Override 
    @SuppressWarnings("rawtypes") 
    public Object decode(Class targetClass, Object fromDBObject, MappedField field) throws MappingException { 
     if (fromDBObject == null) { 
      return null; 
     } 
     DBObject dbo = (DBObject) fromDBObject; 
     JsonElement jsonElement = new JsonParser().parse(dbo.toString()); 
     ComputeExpTraversalTree expTraversalTree = new Gson().fromJson(
       jsonElement, ComputeExpTraversalTree.class); 
     return expTraversalTree; 
    } 

} 

構成:これは参考になる

Morphia morphia = new Morphia(); 
morphia.getMapper().getConverters().addConverter(cls); 

希望。

関連する問題