0

嘿,Stackoverflower 同胞,

我最近尝试将 Spring 的 Spring.Data.Neo4j 连接器与 Neo4J 数据库结合使用。正确配置后,我遇到了以下问题。存储基于 JavaFX 的实体时,JavaFX 属性设置为 null。这很可能是这种情况,因为 spring.data.neo4j 似乎没有使用 getter 和 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 bean?还是我做错了什么?

谢谢你的帮助,卡尔

4

3 回答 3

1

现在 SDN 只使用您实体的字段,这样的事情将是可配置的更改。随时在JIRA上提出问题以实施它。

于 2012-12-02T20:52:23.170 回答
1

该问题可能取决于 Spring Data Neo4j 如何映射字段,这些字段是对非节点实体的类对象的引用,即未使用 @NodeEntity 注释。在这种情况下,引用的类必须可转换为 String(请参阅文档)。我有一个类似的问题,我解决了它,声明了一个 Spring 转换工厂,该工厂管理从引用的类到 String 的映射并返回。这是一个将扩展嵌入式接口的每个类(它是无效的,只是为了将类标记为可嵌入)映射到 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 回答