2012-12-02 57 views
0

嘿傢伙Stackoverflower,獲得彈簧數據的Neo4j使用getter和setter

我最近嘗試使用Spring的Spring.Data.Neo4j連接器結合Neo4j的數據庫。正確配置配置後,我遇到了以下問題。當存儲我的基於JavaFX的實體時,JavaFX屬性被設置爲null。這很可能是因爲spring.data.neo4j似乎不使用getters和setter,而是反射。由於它不知道如何保存JavaFX屬性,因此它在從數據庫中檢索時會保留空值並覆蓋它們。

這是我的實體

@NodeEntity 
public class User implements UserIF { 
    @GraphId  
    private Long id = null; 

    private final StringProperty nameProperty = new SimpleStringProperty(); 

    public String getName() { 
     return nameProperty.get(); 
    } 

    public void setName(String name) { 
     nameProperty.set(name); 
    } 
} 

是否有可能得到Spring.data.neo4j使用getter和setter方法訪問,讓我能堅持我的JavaFX的豆?或者我做錯了什麼?

感謝您的幫助, 卡爾

回答

1

現在SDN只是利用你的實體領域,像這樣將是一個可配置的變化。請隨時在JIRA上提出實施它的問題。

+0

感謝您的快速響應。我將發佈功能請求。 :) – DrEnquinox

+0

對於閱讀本條目的其他人,我在此發佈了一個功能請求:[JIRA](https://jira.springsource.org/browse/DATAGRAPH-315) – DrEnquinox

+0

我發現neo4j和javafx非常易於使用,沒有任何ORM。如果它阻止你的工作,可能是一個想要把春天澆水的想法。 –

1

這個問題可能取決於Spring Data Neo4j如何映射引用非類節點對象的字段,即不用@NodeEntity註釋的字段。 在這種情況下,被引用的類必須可以轉換爲字符串(see documentation)。 我有一個類似的問題,我解決了它聲明一個Spring轉換工廠,管理從引用的類到字符串和後面的映射。 這是一個例子的每個延伸嵌入式接口(它是無效的,只是爲了將類標記爲可嵌入)到字符串,反之亦然類映射:

final class EmbeddedToStringConverterFactory implements ConverterFactory<Embedded, String> { 

     @Override 
     public <T extends String> Converter<Embedded, T> getConverter(Class<T> type) { 
      return new EmbeddedToStringConverter(type); 
     } 

     private final class EmbeddedToStringConverter<E extends Embedded, S extends String> implements Converter<E, S> { 

      private Class<S> stringType; 

      public EmbeddedToStringConverter(Class<S> stringType) { 
       this.stringType = stringType; 
      } 

      @Override 
      public S convert(E source) { 
       if (source != null) { 
        return (S) new Gson().toJson(source); 
       } else { 
        return null; 
       } 
      } 
     } 
    } 

final class StringToEmbeddedConverterFactory implements ConverterFactory<String, Embedded> { 

    @Override 
    public <T extends Embedded> Converter<String, T> getConverter(Class<T> type) { 
     return new StringToEmbeddedConverter(type); 
    } 

    private final class StringToEmbeddedConverter<S extends String, E extends Embedded> implements Converter<S, E> { 

     private Class<E> embeddedType; 

     public StringToEmbeddedConverter(Class<E> embeddedType) { 
      this.embeddedType = embeddedType; 
     } 

     @Override 
     public E convert(S source) { 
      if (source != null) { 
       return (E) new Gson().fromJson(source, embeddedType); 
      } else { 
       return null; 
      } 
     } 
    } 
} 

轉換工廠應Neo4j的配置文件中可以聲明如下:

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <bean class="EmbeddedToStringConverterFactory"/> 
      <bean class="StringToEmbeddedConverterFactory"/> 
     </list> 
    </property> 
</bean> 
+0

你可以分享轉換工廠嗎? – Spindizzy

+0

@Spindizzy我用一些代碼片段編輯了我的答案。 – remigio

+0

非常感謝! – Spindizzy

0

我在我的bean中有與StringProperty相同的問題。 @remigio的答案幫助我找到了解決方案。

所以我加入轉爐廠:

public class StringPropertyToStringConverterFactory 
implements ConverterFactory<StringProperty, String> { 

    @Override 
    public <T extends String> Converter<StringProperty, T> getConverter(final Class<T> type) { 
     return new StringPropertyToStringConverter<>(); 
    } 

    private final class StringPropertyToStringConverter<E extends StringProperty, S extends String> 
    implements Converter<E, S> { 
     @Override 
     public S convert(final E s) { 
      if (s != null) { 
       return (S) s.getValue(); 
      } else { 
       return null; 
     } 
     } 
    } 
} 
public class StringToStringPropertyConverterFactory 
implements ConverterFactory<String, StringProperty> { 
    @Override 
    public <T extends StringProperty> Converter<String, T> getConverter(final Class<T> type) { 
     return new StringToStringPropertyConverter<>(); 
    } 

    private final class StringToStringPropertyConverter<S extends String, E extends StringProperty> 
    implements Converter<S, E> { 
    @Override 
    public E convert(final S s) { 
     if (s != null) { 
      return (E) new SimpleStringProperty(s); 
     } else { 
      return null; 
     } 
    } 
    } 
} 

然後我註冊在我的Neo4jConfiguration這些轉換器工廠:

public class AppConfig extends Neo4jConfiguration { 
    public AppConfig() { 
     setBasePackage("org.foo.bar"); 
     addConversionService(); 
    } 

    private void addConversionService() { 
     ConversionServiceFactoryBean conversionService = new ConversionServiceFactoryBean(); 
     conversionService.setConverters(
     newHashSet(new StringPropertyToStringConverterFactory(), 
      new StringToStringPropertyConverterFactory())); 
     conversionService.afterPropertiesSet(); 
     setConversionService(conversionService.getObject()); 
    } 
} 

我不喜歡的是,我不得不調用該方法afterPropertiesSet() 。也許有一種更優雅的方式。但畢竟它的工作,並保存屬性。