Spring Data Neo4j - 复杂类型类成员的关系属性

时间:2014-04-02 13:27:51

标签: spring neo4j spring-data-neo4j

我有一个用@RelationshipEntity注释的类。 这个类包含我用一些整数值定义的对象。 有可能以某种方式定义嵌套对象的成员将被保存为关系中的属性吗?

者Justyna。

1 个答案:

答案 0 :(得分:0)

是的,但应将它们转换为提供自定义Spring转换器的字符串。为了避免为您需要嵌入的每个类声明转换器,您可以扩展一个公共接口(即使是空接口,只是为了声明转换器)。 必须在SDN配置文件中声明转换器,如下所示:

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

您应该定义两个转换器,一个用于将对象转换为字符串,另一个用于从字符串到对象的相反转换。 例如,使用Gson:

final class ToStringConverterFactory implements ConverterFactory<MyClass, String> {

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

    private final class ToStringConverter<E extends MyClass, S extends String> implements Converter<E, S> {

        private Class<S> stringType;

        public ToStringConverter(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 ToObjectConverterFactory implements ConverterFactory<String, MyClass> {

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

    private final class ToObjectConverter<S extends String, E extends MyClass> implements Converter<S, E> {

        private Class<E> objectType;

        public ToObjectConverter(Class<E> objectType) {
            this.objectType = objectType;
        }

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