簡體   English   中英

為什么簡單設置然后在動態代理上獲取不持久? (使用TinkerPop Frames JavaHandler)

[英]Why simple set and then get on Dynamic Proxy does not persist? (using TinkerPop Frames JavaHandler)

我想在實現VertexFrame的類上添加簡單的getter和setter,我為此使用了JavaHandlers。 對於那些方法,我不想與數據庫進行任何交互。 不幸的是沒有@Ignore之類的東西,所以我沒有意外的注釋異常。 當我在代理服務器上設置某些內容並在經過反射后立即執行獲取操作時,不會存儲任何內容。 可能是我不應該使用JavaHandlers,而是使用其他東西。Btw manager.frame返回Java動態代理對象(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,但不能。 請讓我知道是否有任何解決方案可以添加可保留在代理服務器上的非數據庫數據。

首先,您在幾個地方出了問題:

Property key is reserved for all elements: id

基本上,您不能在@Property("id")批注中使用屬性值“ id”。

其次,盡管它不會失敗,但是您的Vert類應該:

  • 實現JavaHandlerContext<Vertex>
  • abstract
  • 使用Vertex的屬性持久保存值(局部變量存儲在圖形數據庫中!)
  • 實現/覆蓋用@JavaHandler注釋的方法

此外,您不需要存儲Vertex 因為您的IVert接口擴展了VertexFrame ,所以您可以使用asVertex()方法訪問Vertex

您絕對應該重新閱讀文檔,請參閱示例-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();

}

韋爾

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM