【发布时间】:2016-09-13 03:30:33
【问题描述】:
我主要使用 Codename One 中的 Mirah 库作为 Json 和 Java 类之间的对象映射器。
我遇到了 Mirah 尝试映射未在 .mirah 类中声明的类的问题。例如,我的 .mirah 类有一个 Product 数据映射器
data_mapper 产品:ProductMapper
但错误是抱怨 IUser 接口而不是 Product 类!首先,我不明白为什么 Mirah 会抱怨一个未声明为数据映射器的类。我错过了什么吗?请记住,在我当前的代码中,Product 只有原始数据类型变量,绝对没有对 IUser 接口或 User 实现类的引用。
nbproject\mirah-build-cn1.xml:152: java.lang.RuntimeException:找不到接口 IUser 的存根 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 在 com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99) 在 com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) 在 com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:550) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) 在 ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) 在 ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor68.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:435) 在 org.apache.tools.ant.Target.performTasks(Target.java:456) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1364) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1248) 在 org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:286) 在 org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:555) 在 org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153) 构建失败(总时间:10 秒)
我还想提一下,我高度怀疑清理项目可能不会清理所有 Mirah 生成的类。由于上述错误,我根本无法构建我的应用程序,我尝试从我的项目中删除“.mirah”类,然后尝试清理和重建,但从那时起我仍然收到相同的错误。
我能够让项目再次编译的唯一方法是启动一个全新的项目并将我的源文件移到那里,将 .mirah 类排除在外。
感谢任何见解!
更多详情以下更新
嗨,史蒂夫。非常感谢您的反馈!我花了一些时间试图找出问题所在。我认为这个问题与泛型有关。据我所知,泛型类型在编译时被替换,所以我猜 Codename One 会支持泛型就好了。在尝试走 Mirah 路线之前,我的代码也编译得很好。我真的认为米拉是一个绝妙的主意。
这里有几个步骤可以重现问题。我开始了一个 CN1 Hello world 项目并创建了以下类
1)爱之家
import java.util.List;
public interface IHouse<W extends IWindow> {
public int getHouseColor();
public void setHouseColor(int color);
public List<W> getWindows();
public void setWindows(List<W> windows);
}
2)IWindow
public interface IWindow {
public int getWindowColor();
public void setWindowColor(int newColor);
public String getShape();
}
3) 圆窗
public class RoundWindow implements IWindow {
private int windowColor;
private String shape;
public RoundWindow() {
String shape = "ROUND";
}
@Override
public int getWindowColor() {
return windowColor;
}
@Override
public void setWindowColor(int newColor) {
windowColor = newColor;
}
@Override
public String getShape() {
return shape;
}
}
4) 方形窗口
public class SquareWindow implements IWindow {
private int windowColor;
private String shape;
public SquareWindow() {
String shape = "SQUARE";
}
@Override
public int getWindowColor() {
return windowColor;
}
@Override
public void setWindowColor(int newColor) {
windowColor = newColor;
}
@Override
public String getShape() {
return shape;
}
}
5) 房子
public class House implements IHouse<RoundWindow> {
private int houseColor;
List<RoundWindow> windows;
@Override
public int getHouseColor() {
return houseColor;
}
@Override
public void setHouseColor(int color) {
houseColor = color;
}
@Override
public List<RoundWindow> getWindows() {
return windows;
}
@Override
public void setWindows(List<RoundWindow> windows) {
this.windows = windows;
}
}
回顾一下,我有一个 IHouse 接口,它支持实现 IWindow 的任何类型的窗口。然后实现 IHouse 接口的 House 类可以严格指定它支持/使用的 Window。
在添加 Mirah 插件之前,此代码在 CN1 中编译良好。虽然我收到与我之前添加 Mirah 时解释的相同的错误。
执行此行时发生以下错误: C:\Users\location\NetBeansProjects\Test\nbproject\mirah-build.xml:51: java.lang.RuntimeException:找不到接口 IHouse 的存根 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 在 com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99) 在 com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) 在 com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:550) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) 在 ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) 在 ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:435) 在 org.apache.tools.ant.Target.performTasks(Target.java:456) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1364) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1248) 在 org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:286) 在 org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:555) 在 org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153) 构建失败(总时间:9 秒)
Few Observation,如果我删除 House 类,代码构建良好(最后显示“构建成功”)但我看到以下警告。我相信这是由于试图预编译一个通用接口,我们还不知道 w 的确切类型(直到运行时)。这可能是问题的根本原因。
Failed to get signature for method
public List<W> getWindows();
Failed to get signature for method
public void setWindows(List<W> windows);
最后,更改我的模型设计并完全摆脱泛型可以让我的代码再次编译,而没有任何 Mirah 投诉。在我的实际项目中,出于多种原因,我想保留我当前的设计(使用泛型)。
是否可以同时使用 Mirah Json 到 Java 的转换工具以及泛型?
提前感谢您的宝贵时间!
【问题讨论】:
-
泛型应该可以工作。如果你能把它窒息的课程发给我(
public List<W> getWindows()的课程,我会把它添加到我的测试套件中并尝试找出问题所在)。 -
是的,对不起!我两次发布了 House 课程。我的意思是真正提出 IHouse,然后是实施 House 类。我在 IHouse 界面上方更新了#1)
-
其实,那些警告应该还是没问题的。问题是 IUser 界面。任何导致它失败的原因都集中在 IUser 界面上。相关类将是实现 IUser 或在其公共方法或字段签名(即参数和返回类型)中引用它的类。
-
那么您是否看到项目中的 5 个类由于此错误而导致构建失败? “在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 找不到接口 IUser 的存根”,由于这个问题,它基本上停止了构建。
-
不,我没有看到这个问题。
标签: codenameone