希望尝试使用GWT-Jackson-Apt库进行某些RPC,但是在查看示例并尝试运行一些演示时,总会有接口带有奇怪的未定义构造函数调用。
@JSONMapper
public interface SampleMapper extends ObjectMapper<SimpleBean> {
SampleMapper INSTANCE = new App_SampleMapperImpl();
}
我一直在研究,但是在源代码中的任何地方都没有定义 App_SampleMapperImpl()。而且它没有编译,说有一个未定义的符号
在自述文件的示例中完成了完全相同的操作,可在此页面上找到https://github.com/DominoKit/gwt-jackson-apt/tree/f60d0358b90bcbf78d066796f680aeae1d7156bb
谁能解释这是怎么回事?如何定义或暗示此构造函数?我该怎么做才能编译示例?
答案 0 :(得分:3)
假设您正在制作Maven项目,那么重要的是要包括生成映射器的注释处理器。然后,一旦项目知道如何生成它们,您就可以在代码中使用它们。
注释处理器在编译器运行时运行 ,这意味着从技术上讲,您可以编写似乎不会进行编译的代码。然后,在编译器运行时,它要求所有注册的注释处理器根据注释和现有类型(您可能会想到的checkArgCount
之类的丢失引用, not )生成代码。然后处理器运行,生成缺少的类,然后继续编译。
通常情况是,您在编写代码时进行构建(例如,eclipse在每次保存文件时执行此操作,在您请求进行构建时intellij进行此操作,等等),然后该类存在并且可以被引用向前走。即使在清理并重建项目后,尽管该引用似乎不起作用,但只要编译器运行,它将立即起作用。
在这种情况下,我们需要遵循示例以确保存在处理器。在https://github.com/DominoKit/gwt-jackson-apt/blob/f60d0358b90bcbf78d066796f680aeae1d7156bb/samples/shared-mappers/shared-mappers-shared/pom.xml中,我们在依赖项中看到了这一点:
App_Sample_MapperImpl
此标记为 <dependency>
<groupId>org.dominokit.jackson</groupId>
<artifactId>jackson-apt-processor</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
,因为只需要编译即可,因此不应将其包含在以后的依赖图中。对于每个特定的IDE,您可能需要指定其他选项以使其自动重新运行(Eclipse中的复选框,我相信IntelliJ中什么都没有,而且我使用了很长时间也没有使用其他IDE)。
关于Maven的最后一点说明:您必须使用相对较新的maven-compiler-plugin才能正确处理生成的代码:最新版本为3.8.0,于2018年7月发布,但我认为3.5.1之后的任何内容都足够您必须使用较旧的。
答案 1 :(得分:0)
只需遵循项目主页上的示例:https://github.com/DominoKit/gwt-jackson-apt/
那行得通吗?