Spring Data Neo4j转换地图

问题描述

我正在通过螺栓连接使用spring-boot-starter-data-neo4j并面临一个问题:Neo4j只能使用String或Enum键存储地图(如HashedMap 来实现)({ {3}}),为避免使用String键,我创建了一个Converter来解决此问题:

public class IntegerMapConverter implements AttributeConverter<Map<Integer,String>,Map<String,String>> {

    @Override public Map<String,String> toGraPHProperty(Map<Integer,String> integerMap) {
        return integerMap.keySet().stream()
                .collect(Collectors.toMap(Object::toString,integerMap::get));
    }

    @Override public Map<Integer,String> toEntityAttribute(Map<String,String> stringMap) {
        return stringMap.keySet().stream()
                .collect(Collectors.toMap(Integer::valueOf,stringMap::get));
    }
}

因此,基本上,我将Map中的Integer键转换为String键。我使用该转换器的课程如下:

@NodeEntity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Task {
    @Id
    @GeneratedValue
    private Long id;

    private String question;

    @Convert(IntegerMapConverter.class)
    private Map<Integer,String> answers;

    private int solutionNumber;
}

但是,如果我想运行该应用程序,则首先尝试通过Spring Data接口访问(并保存sg)数据库,但出现此错误

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:787) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at com.thesis.studyapp.StudyappApplication.main(StudyappApplication.java:28) [classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.2.6.RELEASE.jar:2.2.6.RELEASE]
Caused by: org.neo4j.driver.exceptions.ClientException: Property values can only be of primitive types or arrays thereof
    at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:143) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
    at org.neo4j.driver.internal.InternalResult.blockingGet(InternalResult.java:128) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
    at org.neo4j.driver.internal.InternalResult.hasNext(InternalResult.java:64) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
    at org.neo4j.ogm.drivers.bolt.response.BoltResponse.columns(BoltResponse.java:65) ~[neo4j-ogm-bolt-driver-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.drivers.bolt.response.RowModelResponse.<init>(RowModelResponse.java:40) ~[neo4j-ogm-bolt-driver-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.drivers.bolt.request.BoltRequest.execute(BoltRequest.java:113) ~[neo4j-ogm-bolt-driver-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.request.RequestExecutor.executeStatements(RequestExecutor.java:131) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.request.RequestExecutor.lambda$executeSave$2(RequestExecutor.java:87) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.Neo4jSession.lambda$doInTransaction$1(Neo4jSession.java:558) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:590) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.Neo4jSession.doInTransaction(Neo4jSession.java:557) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.request.RequestExecutor.executeSave(RequestExecutor.java:80) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.delegates.SaveDelegate.save(SaveDelegate.java:90) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.delegates.SaveDelegate.save(SaveDelegate.java:51) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at org.neo4j.ogm.session.Neo4jSession.save(Neo4jSession.java:480) ~[neo4j-ogm-core-3.2.10.jar:3.2.10]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.data.neo4j.transaction.SharedSessionCreator$SharedSessionInvocationHandler.lambda$invoke$1(SharedSessionCreator.java:121) ~[spring-data-neo4j-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.data.neo4j.transaction.SharedSessionCreator$SharedSessionInvocationHandler.invokeInTransaction(SharedSessionCreator.java:159) ~[spring-data-neo4j-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at org.springframework.data.neo4j.transaction.SharedSessionCreator$SharedSessionInvocationHandler.invoke(SharedSessionCreator.java:123) ~[spring-data-neo4j-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at com.sun.proxy.$Proxy84.save(UnkNown Source) ~[na:na]
    at org.springframework.data.neo4j.repository.support.SimpleNeo4jRepository.save(SimpleNeo4jRepository.java:74) ~[spring-data-neo4j-5.2.6.RELEASE.jar:5.2.6.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:204) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:657) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) ~[spring-tx-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at com.sun.proxy.$Proxy98.save(UnkNown Source) ~[na:na]
    at com.thesis.studyapp.StudyappApplication.lambda$demo$0(StudyappApplication.java:111) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) [spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
    ... 10 common frames omitted
    Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause: null
        at org.neo4j.driver.internal.util.ErrorUtil.newNeo4jError(ErrorUtil.java:79) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.async.inbound.InboundMessagedispatcher.handleFailureMessage(InboundMessagedispatcher.java:105) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.messaging.v1.MessageReaderV1.unpackFailureMessage(MessageReaderV1.java:83) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.messaging.v1.MessageReaderV1.read(MessageReaderV1.java:59) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:83) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:35) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.BytetoMessageDecoder.fireChannelRead(BytetoMessageDecoder.java:321) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.BytetoMessageDecoder.channelRead(BytetoMessageDecoder.java:295) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:47) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.BytetoMessageDecoder.fireChannelRead(BytetoMessageDecoder.java:321) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.handler.codec.BytetoMessageDecoder.channelRead(BytetoMessageDecoder.java:295) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at org.neo4j.driver.internal.shaded.io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[neo4j-java-driver-4.0.1.jar:4.0.1-979f102fbfd27e6393f672da8c7d59f6fabbbe0e]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_201]

2020-09-14 17:26:03.222  INFO 288 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
2020-09-14 17:26:03.224  INFO 288 --- [  restartedMain] o.n.ogm.drivers.bolt.driver.BoltDriver   : Shutting down Bolt driver org.neo4j.driver.internal.InternalDriver@62326de3 

Process finished with exit code 1

我也尝试转换为Map ,但是遇到了同样的错误。是否有一个好的(或任何一种)解决方案,可以以某种方式将地图转换为Neo4j可接受的形式?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)