0

こんにちは、Stackoverflower さん。

私は最近、Spring の Spring.Data.Neo4j コネクタを Neo4J データベースと組み合わせて使用​​しようとしました。構成を正しく行った後、次の問題が発生しました。JavaFX ベースのエンティティを格納すると、JavaFX プロパティが null に設定されました。spring.data.neo4j は getter と setter を使用していないように見えますが、代わりにリフレクションを使用しているため、これが最も可能性が高いです。JavaFX プロパティを永続化する方法がわからないため、DB から取得するときに null 値を永続化して上書きします。

これは私のエンティティです

@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 Bean を保持できるようにすることは可能ですか? それとも私は何か間違ったことをしていますか?

助けてくれてありがとう、カール

4

3 に答える 3

1

現在、SDN はエンティティのフィールドのみを使用しています。このようなものは、構成可能な変更になります。それを実装するために、 JIRAでお気軽に問題を提起してください。

于 2012-12-02T20:52:23.170 に答える
1

この問題は、Spring Data Neo4j が、ノード エンティティではない、つまり @NodeEntity でアノテーションが付けられていないクラスのオブジェクトへの参照であるフィールドをどのようにマップするかに依存する可能性があります。この場合、参照されるクラスは String に変換可能でなければなりません (ドキュメントを参照してください)。同様の問題があり、参照されたクラスから String へのマッピングとその逆のマッピングを管理する Spring 変換ファクトリを宣言して解決しました。これは、Embedded インターフェイスを拡張するすべてのクラス (クラスを埋め込み可能としてマークするためだけに無効です) を String に、およびその逆にマッピングする例です。

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>
于 2012-12-07T13:58:48.717 に答える
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()です。もっとエレガントな方法があるかもしれません。しかし、結局それは機能し、プロパティは保存されます。

于 2015-08-03T14:51:14.133 に答える