Почему простой набор, а затем получить на динамическом прокси не сохраняется? (используя TinkerPop Frames JavaHandler)

Я хотел добавить простые методы получения и установки в класс, который реализует VertexFrame, и я использовал JavaHandlers для них. Для этих методов я не хотел иметь никакого взаимодействия с базой данных. К сожалению, нет ничего похожего на @Ignore, поэтому у меня нет неожиданных исключений аннотации. Когда я устанавливаю что-то на прокси и сразу же получаю после того, как это проходит отражение, ничего не сохраняется. Может быть, я не должен использовать JavaHandlers, а что-то еще.. Кстати, manager.frame возвращает объекты Java Dynamic Proxy (java.lang.reflect.Proxy). Вот неудачный тест:

package com.tests.testbed;
import org.springframework.util.Assert;

import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory;
import com.tinkerpop.frames.FramedGraph;
import com.tinkerpop.frames.FramedGraphFactory;
import com.tinkerpop.frames.modules.javahandler.JavaHandlerModule;

public class testProxy {
    public static void main(String args[]){
        TinkerGraph graph = TinkerGraphFactory.createTinkerGraph();
        FramedGraphFactory framedFactory = new FramedGraphFactory(new JavaHandlerModule());
        FramedGraph<TinkerGraph> manager = framedFactory.create(graph);
        Vertex vertex = manager.getVertex(1);
        IVert vert = manager.frame(vertex, IVert.class);
        int testVal = 231;
        vert.setTestVar(231);
        Assert.state(vert.getTestVar() != testVal, "int was not stored!");
    }

}

---------------------

package com.tests.testbed;

import com.tinkerpop.frames.Property;
import com.tinkerpop.frames.VertexFrame;
import com.tinkerpop.frames.modules.javahandler.JavaHandler;
import com.tinkerpop.frames.modules.javahandler.JavaHandlerClass;

@JavaHandlerClass(Vert.class)
public interface IVert extends VertexFrame {
    @Property("id")
    public int getId();
    @Property("id")
    public void setId(int id);

    @JavaHandler
    public void setTestVar(int testVar);

    @JavaHandler
    public int getTestVar();
}

--------------------

package com.tests.testbed;

import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.tg.TinkerGraph;
import com.tinkerpop.blueprints.impls.tg.TinkerGraphFactory;

public class Vert implements IVert {

    private Vertex vertex;
    private int id;
    private int testVar;

    public void setTestVar(int testVar){
        this.testVar = testVar;
    }

    public int getTestVar(){
        return this.testVar;
    }

    @Override
    public Vertex asVertex() {
        if (this.vertex == null){
            TinkerGraph graph = TinkerGraphFactory.createTinkerGraph();
            Vertex v = graph.getVertex(this.getId());
            this.vertex = v;
        }
        return this.vertex;
    }

    @Override
    public int getId() {
        return this.id;
    }

    @Override
    public void setId(int id) {
        this.id = id;

    }
}

Большое спасибо. PS Я уже добавил это как проблему в случае, если это ошибка: https://github.com/tinkerpop/frames/issues/109 Я попытался получить объект TargetObject, но не смог. Пожалуйста, дайте мне знать, если есть какое-либо решение для добавления данных не из базы данных, которые могут сохраняться на Прокси.

1 ответ

Вы ошиблись в нескольких местах, в первую очередь:

Property key is reserved for all elements: id

По сути, вы не можете использовать значение свойства "id" в вашем @Property("id") аннотаций.

Во-вторых, хотя это не подводит, ваш Vert класс должен:

  • воплощать в жизнь JavaHandlerContext<Vertex>
  • быть abstract
  • сохранить значения с помощью Vertexсвойства (локальные переменные НЕ хранятся в графе db!)
  • только реализовать / переопределить методы, помеченные как @JavaHandler

Кроме того, вам не нужно хранить Vertex, Потому что ваш IVert интерфейс расширяется VertexFrameу вас есть доступ к Vertex с использованием asVertex() метод.

Вы должны обязательно перечитать документацию, см. Примеры - https://github.com/tinkerpop/frames/wiki/Java-Handler

Вот переписанные / рабочие классы. Примечание: я использовал Groovy - он должен быть точно таким же / очень похожим для Java.

IVert

@JavaHandlerClass(Vert.class)
public interface IVert extends VertexFrame {

    @Property("xxid")
    public int getId();

    @Property("xxid")
    public void setId(int id);

    @JavaHandler
    public void setTestVar(int testVar);

    @JavaHandler
    public int getTestVar();

}

Vert

abstract class Vert implements JavaHandlerContext<Vertex>, IVert {

    public void setTestVar(int testVar){
        asVertex().setProperty('foobar', testVar);
    }

    public int getTestVar(){
        return (int)asVertex().getProperty('foobar');
    }

}

Основной метод (Groovy)

def g = TinkerGraphFactory.createTinkerGraph()
FramedGraphFactory factory = new FramedGraphFactory(new JavaHandlerModule())
FramedGraph framedGraph = factory.create(g)
IVert vert = framedGraph.addVertex('myuniqueid', IVert)
vert.setId(123)
vert.setTestVar(456)
IVert vert2 = framedGraph.getVertex('myuniqueid', IVert)
assert vert2.id == 123
assert vert2.testVar == 456
Другие вопросы по тегам