5

Poniżej jest kontynuacją pytanie Question 13832188:Utrzymujące Przedmioty zawierające obiekty ze sprężyną-data-MongoDB

Używam spring-data-mongodb wersję 1.1.1.RELEASE. Mogę utrzymywać obiekt, jeśli wszystkie zmienne składowe są typami pierwotnymi, nawet jeśli nazwy argumentów @PersistenceConstructor nie odpowiadają dokładnie nazwom zmiennych składowych przy użyciu adnotacji @Field i @Value.

Jednak otrzymuję MappingInstantiationException, gdy próbuję zachować obiekty, które zawierają inne obiekty. Moje pytania:

  • Czy to błąd w spring-data-mongodb, czy robię coś nie tak?
  • Co trzeba zmienić, aby prawidłowo przechowywać obiekty zawierające obiekty?

.

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 

moich PrimitiveContainer i ObjectContainer klas są wymienione poniżej:

@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: ** Co ciekawe, zmieniając ciąg w @Field adnotacji na coś innego niż "własności" lub usuwając Adnotacja @Field w całości dla ObjectContainerm_property pozwala na wiosenne dane-mongo-db do właściwości ponownie utworzyć instancję mojej utrwalonej klasy ObjectContainer. Nie rozumiem, dlaczego to działa. Ktoś ma jakieś pomysły?

+0

Jak wyglądają dokumenty źródłowe? To znaczy. jak wygląda dokument w bazie danych? –

+0

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

Odpowiedz

2

Wygląda na to, że znalazłeś błąd. Wartość wynikająca z pierwszej oceny wyrażeń Spela wynosi DBObject i nie jest faktycznie tłumaczona na typ parametru. Mam już tutaj lokalnie kod, który to naprawia. Czy mogłabyś utworzyć bilet na Spring Data MongoDB, aby zgłosić to jako błąd?

+0

Stworzyłem [DATAMONGO-592] (https://jira.springsource.org/browse/DATAMONGO-592) w celu śledzenia tego problemu. Dzięki za pomoc!! –

+0

Odkryłem także, że nie mogę ustawiać obiektów trwałych, które zawierają prymitywne tablice. Czy błąd uniemożliwia mi prawidłowe utrzymywanie obiektów zawierających ten sam błąd, który uniemożliwia mi prawidłowe utrzymywanie obiektów zawierających prymitywne tablice? Zobacz szczegóły problemu z tablicą w [StackOverflow 13884637] (http://stackoverflow.com/questions/13884637) –

Powiązane problemy