5

Nachfolgend finden Sie eine Folgefrage zu Question 13832188 enthält:Persisting Objekte Objekte mit Feder-data-mongodb

Ich verwende spring-data-mongodb Version 1.1.1.RELEASE. Ich kann ein Objekt persistieren, wenn alle Elementvariablen primitive Typen sind, auch wenn die Namen der Argumente @PersistenceConstructor nicht exakt mit den Namen der Elementvariablen übereinstimmen, indem die @Field und @Value Annotationen verwendet werden.

Allerdings bekomme ich eine MappingInstantiationException, wenn ich versuche, Objekte, die andere Objekte enthalten, zu erhalten. Meine Fragen:

  • Ist das ein Fehler in spring-data-mongodb oder mache ich etwas falsch?
  • Was muss geändert werden, damit Objekte, die Objekte enthalten, ordnungsgemäß beibehalten werden können?

.

@Document 
class PrimitiveContainer { 

    @Field("property") 
    private final int m_property; 

    @PersistenceConstructor 
    public PrimitiveContainer(@Value("#root.property") int a_property) { 
     m_property = a_property; 
    } 

    public int property() { 
     return m_property; 
    } 
} 

@Document 
class ObjectContainer { 

    @Field("property") 
    private final PrimitiveContainer m_property; 

    @PersistenceConstructor 
    public ObjectContainer(@Value("#root.property") PrimitiveContainer a_property) { 
     m_property = a_property; 
    } 

    public PrimitiveContainer property() { 
     return m_property; 
    } 
} 

** UPDATE:

org.springframework.data.mapping.model.MappingInstantiationException: Could not instantiate bean class [com.recorder.TestRecorder2$ObjectContainer]: Illegal arguments for constructor; nested exception is java.lang.IllegalArgumentException: argument type mismatch 
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:77) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:229) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:209) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:173) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:169) 
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:72) 
    at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1820) 
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1542) 
    at org.springframework.data.mongodb.core.MongoTemplate.findAll(MongoTemplate.java:1064) 
    at com.recorder.TestRecorder2.testObjectContainer(RecorderTest2.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.recorder.TestRecorder2$ObjectContainer]: Illegal arguments for constructor; nested exception is java.lang.IllegalArgumentException: argument type mismatch 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:158) 
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:75) 
    ... 34 more 
Caused by: java.lang.IllegalArgumentException: argument type mismatch 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) 
    ... 35 more 

Meine PrimitiveContainer und ObjectContainer Klassen sind unten aufgeführt ** Seltsamerweise, die Zeichenfolge in der @Field Anmerkung auf etwas anderes als "Eigentum" ändern oder entfernen Die @Field Annotation vollständig für die ObjectContainerm_property ermöglicht Feder-Daten-Mongo-db zu Eigenschaft wieder instanziieren meine persistente ObjectContainer Klasse. Ich verstehe nicht, warum das funktioniert. Hat jemand Ideen?

+0

Wie sehen die Quelldokumente aus? I.e. Wie sieht das Dokument in der Datenbank aus? –

+0

{"_id": Objekt-ID ("50ca271c4566a2b08f2d667a"), "_class": "com.recorder.TestRecorder2 $ ObjectContainer", "Eigenschaft": {"property": 100}} –

Antwort

2

Sie scheinen einen Fehler gefunden zu haben. Der Wert, der sich aus der ersten Spel-Ausdrucksbewertung ergibt, ist ein DBObject und wird nicht tatsächlich in den Parametertyp übersetzt. Ich habe hier lokal bereits einen Code, der das behebt. Würde es Ihnen etwas ausmachen, ein Ticket gegen Spring Data MongoDB zu erstellen, um dies als Fehler zu speichern?

+0

Ich habe erstellt [DATAMONGO-592] (https://jira.springsource.org/browse/DATAMONGO-592), um dieses Problem zu verfolgen. Danke für Ihre Hilfe!! –

+0

Ich habe auch festgestellt, dass ich nicht Eigenschaft Objekte beibehalten kann, die primitive Arrays enthalten. Ist der Fehler, der mich daran hindert, Objekte, die Objekte enthalten, korrekt zu halten, derselbe Fehler, der mich daran hindert, Objekte mit primitiven Arrays ordnungsgemäß zu behalten? Weitere Informationen zum Array-Problem finden Sie in [StackOverflow 13884637] (http://stackoverflow.com/questions/13884637). –