5

Qui di seguito è una domanda di follow-up a Question 13832188:Persistere gli oggetti contenenti oggetti con la primavera-dati-mongodb

sto usando spring-data-mongodb versione 1.1.1.RELEASE. Sono in grado di mantenere un oggetto se tutte le variabili membro sono tipi primitivi, anche se i nomi degli argomenti @PersistenceConstructor non corrispondono esattamente ai nomi delle variabili membro utilizzando le annotazioni @Field e @Value.

Tuttavia, viene visualizzato un valore MappingInstantiationException quando si tenta di mantenere oggetti contenenti altri oggetti. Le mie domande:

  • Si tratta di un bug in spring-data-mongodb o sto facendo qualcosa di sbagliato?
  • Che cosa è necessario modificare in modo che possa persistere correttamente gli oggetti contenenti oggetti?

.

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 

miei PrimitiveContainer e ObjectContainer classi sono elencati di seguito:

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

** AGGIORNAMENTO: ** Curiosamente, cambiando la stringa nel @Field annotazioni a qualcosa di diverso "proprietà" o la rimozione l'annotazione @Field interamente per ObjectContainerm_property consente a spring-data-mongo-db di rendere nuovamente istantanea la mia classe persistente ObjectContainer. Non capisco perché funzioni. Qualcuno ha qualche idea?

+0

Come sono i documenti di origine? Cioè che aspetto ha il documento all'interno del database? –

+0

{"_id": ObjectId ("50ca271c4566a2b08f2d667a"), "_class": "com.recorder.TestRecorder2 $ ObjectContainer", "proprietà": {"proprietà": 100}} –

risposta

2

Sembra che tu abbia trovato un errore. Il valore risultante dalla prima valutazione dell'espressione Spel è un DBObject e non viene effettivamente tradotto nel tipo di parametro. Ho già un codice qui localmente che lo risolve. Ti dispiacerebbe creare un ticket contro Spring Data MongoDB per archiviarlo come un bug?

+0

Ho creato [DATAMONGO-592] (https://jira.springsource.org/browse/DATAMONGO-592) per tenere traccia di questo problema. Grazie per l'aiuto!! –

+0

Ho anche scoperto che non posso oggetti persist di proprietà che contengono matrici primitive. Il bug che mi impedisce di perseguire correttamente gli oggetti che contengono oggetti lo stesso bug che mi impedisce di persistere correttamente con oggetti contenenti matrici primitive? Guarda i dettagli del problema con l'array in [StackOverflow 13884637] (http://stackoverflow.com/questions/13884637) –