Mirah的问题

时间:2016-09-13 03:30:34

标签: codenameone

我正在使用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转换工具以及泛型?

提前感谢您的时间!

1 个答案:

答案 0 :(得分:2)

Mirah netbeans插件允许项目中的双向mirah-java依赖项。为了实现这一点,它首先编译&#34;存根&#34;项目中的java源代码,以便在mirah编译步骤中可以从Mirah引用它们。在mirah完成编译为.classes之后,它会执行&#34; real&#34; java编译步骤,它引用已编译的mirah文件。这就是它引用IUser类的原因..这就是&#34;预编译&#34;窒息的步骤。

错误表明在预编译java存根时它无法找到IUser类。我必须看到项目才知道原因。