2014-02-21 5 views
0

Я разрабатываю проект scala с использованием библиотеки spring-data-neo4j.scala и spring data neo4j - No FieldAccessor настроен для поля

Во-первых, здесь мой `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 собственности, но интересно, что 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 
} 

, но это не помогло»

EDIT: запрошенный .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> 
+0

Похоже ошибка. Проверьте это: http://forum.spring.io/forum/spring-projects/data/nosql/117347-neo4j-custom-conversionservice-example –

+0

Да, я это видел, но я надеялся, что он был исправлен, потому что сообщение от 2012. – Andna

+0

Да, я тоже это заметил. Лучше всего было бы связаться с Майклом Хунгером - создателем библиотеки neo4j-spring. –

ответ

1

Нам нужен конвертер в в обоих направлениях. Твой только в одном направлении.

В примере SDN для java.util.Date:

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); 
} 
+0

Спасибо, в этом была проблема! Я не подозревал, что вы проверяете наличие обоих конвертеров. – Andna

Смежные вопросы