gpt4 book ai didi

java - 为什么简单设置然后获取动态代理无法持久? (使用 TinkerPop Frames JavaHandler)

转载 作者:行者123 更新时间:2023-12-01 11:41:51 26 4
gpt4 key购买 nike

我想在实现 VertexFrame 的类上添加简单的 getter 和 setter,并且我使用了 JavaHandlers。对于这些方法,我不想与数据库进行任何交互。不幸的是,没有像 @Ignore 这样的东西,所以我没有意外的注释异常。当我在代理上设置某些内容并在经过反射后立即执行 get 操作时,不会存储任何内容。可能是我不应该使用 JavaHandlers 而应该使用其他东西。顺便说一句,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;

}
}

非常感谢。P.S 我已经将其添加为一个问题,以防它是一个错误: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 接口(interface)扩展了 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();

}

垂直

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

关于java - 为什么简单设置然后获取动态代理无法持久? (使用 TinkerPop Frames JavaHandler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29465000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com