EclipseLink版本为2.5.1
我们已从GlassFish网络服务器迁移到TomCat。这使我们转向静态编织,因为使用TomCat动态编织并不是那么容易。 现在静态编织工作,它似乎工作有点不同。 如果我有一个实体直接在构造函数中设置一些属性:
class Entity {
@Column
private String name;
public Entity() {
name = "something";
}
public String getName() {
return name;
}
}
长话短说这个测试会失败:
Entity e = new Entity();
assertEquals("something", e.getName()); // e.getName() returns null
这是因为getName()
在编织后不再返回this.name
。相反,它调用路由进行初始化(如果需要)和(我猜)从一些底层HashMap获取属性的值。
但是构造函数没有被编织,我甚至已经研究了织工的来源,似乎明确地选择了这个:
/**
* Construct a MethodWeaver and allow it to process the method.
*/
@Override
public MethodVisitor visitMethod(int access, String methodName, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, methodName, desc, signature, exceptions);
if (!alreadyWeaved) {
// skip constructors, they will not changed
if (!"<init>".equals(methodName) && !"<cinit>".equals(methodName)) {
// remaining modifications to the 'body' of the class are
// delegated to MethodWeaver
mv = new MethodWeaver(this, methodName, desc, mv);
}
}
return mv;
}
问题是,也许我想念一下这里?使用EclipseLink 2.5.1的实际情况是,您不能直接在实体自己的ctor中使用属性吗? (它甚至没有在任何地方被提及,至少不可论证)
答案 0 :(得分:0)
事实证明是的,我们可以。
但是有一个问题导致我们的财产对吸气剂不可见。 我们实际上在这里有MappedSuperclass继承,我们在子类中隐藏了这个字段。基本上就是这样:
class A {
@Column()
protected String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class B extends A {
@Column()
protected String name;
// no @Override here
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
所以我们只是在遮蔽财产。