2017-09-05 1 views
0

arbeite mit Spring Boot und MongoDB. habe das Repository für mein Modell geschrieben und meine eigene Logik geschrieben, um die ID mit mongo inc zu erhöhen.org.springframework.data.mapping.model.MappingException: Kann ein komplexes Objekt nicht als Schlüsselwert verwenden

gradle Test

die Tests mit der folgenden Ausnahme fehlschlagen, während tun.

org.springframework.data.mapping.model.MappingException: Cannot use a complex object as a key value. 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeMapInternal(MappingMongoConverter.java:669) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.createMap(MappingMongoConverter.java:585) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writePropertyInternal(MappingMongoConverter.java:471) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:430) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$3.doWithPersistentProperty(MappingMongoConverter.java:418) 
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:322) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:418) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.writeInternal(MappingMongoConverter.java:392) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:356) 
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.write(MappingMongoConverter.java:79) 
at org.springframework.data.mongodb.core.MongoTemplate.toDbObject(MongoTemplate.java:853) 
at org.springframework.data.mongodb.core.MongoTemplate.doSave(MongoTemplate.java:1014) 
at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:963) 
at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:80) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:503) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:488) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
at com.sun.proxy.$Proxy94.save(Unknown Source) 
at org.springframework.data.repository.CrudRepository$save.call(Unknown Source) 
at com.auth.mongo.impl.ApplicationRepositoryImpl.save(ApplicationRepositoryImpl.groovy:26) 
at com.auth.repository.ApplicationRepository$save$0.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 

kann mir empfehlen, was falsch mache

EDIT: Zum Beispiel: Anwendungsklasse ist die Domäne

class Application implements Serializable { 

String id 
APIKey apiKey 
Map actions = [:] 

Application() { 
} 

Application(APIKey apiKey) { 
    this.apiKey = apiKey 
    List customerActionsList = [] // added some actions 
    actions.put(Role.User, customerActionsList) 
} 

apikey:

String apiKey 
String application 
DateTime whenCreated 
boolean active 

APIKey() { 
} 

APIKey(String application, DateTime whenCreated, boolean active) { 
    this.apiKey = generateAPIKey(application) 
    this.application = application 
    this.whenCreated = whenCreated 
    this.active = active 
} 

Repository Klasse ist wie folgt:

@Component 
class ApplicationRepositoryImpl implements ApplicationRepository { 

private final Logger logger = LoggerFactory.getLogger(ApplicationRepositoryImpl.class) 

@Autowired 
ApplicationRepositoryMongo applicationRepositoryMongo 

@Autowired 
SequenceRepository sequenceRepository 

@Override 
Serializable save(Application application) { 
    application.id = application.id?:sequenceRepository.getNextSequenceId(Application.simpleName).sequence 
    return applicationRepositoryMongo.save(application).id 
} 

@Override 
Application find(String id) { 
    return applicationRepositoryMongo.findOne(id) 
} 

ich die ID der Anwendungsklasse am Inkrementieren als

public SequenceId getNextSequenceId(String type) { 
    //get sequence type 
    Query query = new Query(Criteria.where("id").is(type)) 
    //increase sequence id by 
    Update update = new Update() 
    update.inc('sequence', 1) 
    //return new increased i 
    FindAndModifyOptions options = new FindAndModifyOptions() 
    options.returnNew(true) 
    //this is the magic happened 
    SequenceId seqId = mongoOperation.findAndModify(query, update, options, SequenceId.class) 
    return seqId 
} 

folgt Während das Domänenobjekt Speichern der oben Ausnahme bekommen. Ich habe alle Mongo-Konfiguration gemacht. Die Konfiguration funktioniert für andere Domänen.

+0

Ausnahme zu unterstützen (für Sie - niemand Sie ohne Code helfen kann) –

+0

Hey @Jacek Cz Ich habe meine Frage mit Code aktualisiert. Bitte schauen Sie und helfen Sie jetzt – SatishY

Antwort

Verwandte Themen