我正在使用Codename One中的Mirah库作为Json和Java类之间的对象映射器。
我遇到了Mirah试图映射未在.mirah类中声明的类的问题。例如,我的.mirah类有一个Product
的数据映射器data_mapper产品:ProductMapper
但错误是抱怨IUser接口而不是Product类!对于初学者,我不明白为什么Mirah会抱怨一个未被声明为数据映射器的类。我错过了什么吗?请记住,在我当前的代码中,Product只有原始数据类型变量,绝对没有引用IUser接口或User实现类。
nbproject文件\米拉-集结cn1.xml:152: java.lang.RuntimeException:无法找到接口IUser的存根 at ca.weblite.asm.JavaExtendedStubCompiler $ 2.visitClass(JavaExtendedStubCompiler.java:694) at 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) at com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) at ca.weblite.asm.JavaExtendedStubCompiler $ 2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) at 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) at ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) at ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) at ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) at ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source) at 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) at 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) at 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路线之前,我的代码编译得很好。我真的认为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)RoundWindow
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)SquareWindow
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 \用户位置\的NetBeansProjects \测试\ nbproject文件\米拉-的build.xml:51: java.lang.RuntimeException:无法找到接口IHouse的存根 at ca.weblite.asm.JavaExtendedStubCompiler $ 2.visitClass(JavaExtendedStubCompiler.java:694) at 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) at com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) at ca.weblite.asm.JavaExtendedStubCompiler $ 2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) at 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) at ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) at ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) at ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) at ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) at ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) at sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) at 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) at 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) at sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) at 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) at 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) at sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) at 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) at 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) at 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秒)
很少观察,如果我删除House类,代码构建良好(显示&#34;构建成功&#34;最后)但我看到以下警告。我相信这些是由于尝试预编译通用接口而我们还不知道w的确切类型(直到运行时)。这可能是问题的根本原因。
Failed to get signature for method
public List<W> getWindows();
Failed to get signature for method
public void setWindows(List<W> windows);
最后,改变我的模型设计并完全摆脱Generics让我的代码再次编译而没有任何Mirah投诉。在我的真实项目中,我想保留当前的设计(使用泛型)有很多原因。
是否可以将Mirah Json转换为Java转换工具以及泛型?
提前感谢您的时间!
答案 0 :(得分:2)
Mirah netbeans插件允许项目中的双向mirah-java依赖项。为了实现这一点,它首先编译&#34;存根&#34;项目中的java源代码,以便在mirah编译步骤中可以从Mirah引用它们。在mirah完成编译为.classes之后,它会执行&#34; real&#34; java编译步骤,它引用已编译的mirah文件。这就是它引用IUser类的原因..这就是&#34;预编译&#34;窒息的步骤。
错误表明在预编译java存根时它无法找到IUser类。我必须看到项目才知道原因。