java - scala 和 spring data neo4j - 没有为字段配置 FieldAccessor

标签 java spring scala spring-data-neo4j

我正在使用 spring-data-neo4j 库开发 scala 项目。

首先,这是我的`build.sbt

name := """scheduling-backend"""

version := "1.0"

scalaVersion := "2.10.2"

resolvers += "spray repo" at "http://repo.spray.io"

resolvers += "spray nightlies" at "http://nightlies.spray.io"

resolvers += "SpringSource Milestone Repository" at "http://repo.springsource.org/milestone"

resolvers += "Neo4j Cypher DSL Repository" at "http://m2.neo4j.org/content/repositories/releases"

libraryDependencies ++= Seq(
  "com.typesafe.akka"  %% "akka-actor"       % "2.2.0",
  "com.typesafe.akka"  %% "akka-slf4j"       % "2.2.0",
  "ch.qos.logback"      % "logback-classic"  % "1.0.13",
  "io.spray"            % "spray-can"        % "1.2-20130712",
  "io.spray"            % "spray-routing"    % "1.2-20130712",
  "io.spray"           %% "spray-json"       % "1.2.3",
  "org.specs2"         %% "specs2"           % "1.14"         % "test",
  "io.spray"            % "spray-testkit"    % "1.2-20130712" % "test",
  "com.typesafe.akka"  %% "akka-testkit"     % "2.2.0"        % "test",
  "com.novocode"        % "junit-interface"  % "0.7"          % "test->default",
  "org.springframework.scala" % "spring-scala" % "1.0.0.M2",
  "org.springframework.data" % "spring-data-neo4j" % "2.3.3.RELEASE",
  "org.springframework.data" % "spring-data-neo4j-rest" % "2.3.3.RELEASE",
  "javax.validation" % "validation-api" % "1.1.0.Final",
  "com.github.nscala-time" %% "nscala-time" % "0.8.0"
)

scalacOptions ++= Seq(
  "-unchecked",
  "-deprecation",
  "-Xlint",
  "-Ywarn-dead-code",
  "-language:_",
  "-target:jvm-1.7",
  "-encoding", "UTF-8"
)

testOptions += Tests.Argument(TestFrameworks.JUnit, "-v")

现在,这是我试图坚持的实体

trait EntityID {
  @GraphId
  var id: java.lang.Long = _
}

@NodeEntity
class Leg() extends EntityID{

  var name: String = _
  var superName:String = _
  @GraphProperty(propertyType = classOf[java.lang.Long])
  var date: DateTime = _
}

以及我用来测试所有内容的代码:

package persistence

import org.junit.runner.RunWith
import org.specs2.runner._
import org.springframework.context.ApplicationContext
import org.specs2.mutable.Specification
import org.springframework.context.support.ClassPathXmlApplicationContext
import org.neo4j.graphdb.GraphDatabaseService
import org.joda.time.DateTime

@RunWith(classOf[JUnitRunner])
class SpringDataTest extends Specification {
  "SpringData should" >> {

    "work" in {
      val ctx2: ApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml")
      val repository = ctx2.getBean(classOf[LegRepository])
      val oldLeg = new Leg
      oldLeg.date = DateTime.now
      oldLeg.name = "newName"
      oldLeg.superName = "asd"
      repository.save(oldLeg)
      val newLeg = repository.findOne(5)
      newLeg.name must beEqualTo("newName")
      success
    }
  }


}

现在,当我尝试保留我的对象时,我会进入日志:

19:46:57.288 [specs2.DefaultExecutionStrategy1] INFO  o.s.d.n.f.DelegatingFieldAccessorFactory - No FieldAccessor configured for field: class org.joda.time.DateTime date rel: false idx: false

所以看来访问 DateTime 属性肯定存在一些问题,但有趣的是,当我使用 Web 界面查看数据库时,String 属性被保存。

我还创建了 DateTime 类型到 Long 的转换器:

package persistence

import org.springframework.core.convert.converter.Converter
import org.joda.time.DateTime
import java.lang

class DateTimeConverter extends Converter[DateTime, java.lang.Long]{
  override def convert(source: DateTime): lang.Long = source.getMillis
}

但这并没有帮助'

编辑:请求的 .xml 配置

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/data/neo4j
            http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd">

    <context:annotation-config/>

    <bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
        <constructor-arg value="http://localhost:7474/db/data/" index="0"/>
    </bean>

    <neo4j:config graphDatabaseService="graphDatabaseService"/>
    <neo4j:repositories base-package="persistence"/>

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="persistence.DateTimeConverter"/>
            </set>
        </property>
    </bean>

</beans>

最佳答案

我们需要一个双向转换器。你的只有一个方向。

在 java.util.Date 的 SDN 示例中:

public void addConverters(ConversionService service) {
    if (service instanceof ConverterRegistry) {
        ConverterRegistry registry = (ConverterRegistry) service;
        registry.addConverter(new DateToStringConverter());
        registry.addConverter(new DateToLongConverter());
        registry.addConverter(new StringToDateConverter());
        registry.addConverter(new NumberToDateConverter());
        registry.addConverter(new EnumToStringConverter());
        registry.addConverterFactory(new StringToEnumConverterFactory());
    } else {
        throw new IllegalArgumentException("conversionservice is no ConverterRegistry:" + service);
    }
}


public static class DateToLongConverter implements Converter<Date, Long> {

    @Override
    public Long convert(Date source) {
        return source.getTime();
    }
}

public static class NumberToDateConverter implements Converter<Number, Date> {

    @Override
    public Date convert(Number source) {
        return new Date(source.longValue());
    }
}

检查如下

public boolean isSerializablePropertyField(final ConversionService conversionService) {
    if (isRelationship()) return false;
    final Class<?> type = getType();
    if (getTypeInformation().isCollectionLike()) {
        return isConvertible(conversionService, getComponentType());
    }
    return isConvertible(conversionService, type);
}

private boolean isConvertible(ConversionService conversionService, Class<?> type) {
    return conversionService.canConvert(type, propertyType) && conversionService.canConvert(propertyType, type);
}

关于java - scala 和 spring data neo4j - 没有为字段配置 FieldAccessor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942764/

相关文章:

java - JGoodies 内存泄漏?? - 当 Spring 尝试显示 View 时出现内存不足异常

Spring Transactional - 确保测试和产品中的可预测行为

压缩集合上的 Scala 函数文字和占位符语法

java - 在不使用 contains 或 indexOf 方法的情况下检查给定字符串是否包含子字符串

java - 如何使用Quarkus指定要在application.properties中使用的基本docker镜像

java - 如何使用 GSON 反序列化嵌套的 JSON 数组?

java - 我的数据源设置有什么问题让 Spring Boot 连接到 MySQL?

java - 通过快捷应用快捷方式打开 fragment

function - Scala 是否提供了一种在不重复参数列表的情况下实现 "proxy"或 "decorate"函数的方法?

scala - 启用迁移警告