GWT-Jackson-Apt看似未定义的类构造函数调用

时间:2019-02-08 14:07:18

标签: java gwt gwt-jackson-apt

希望尝试使用GWT-Jackson-Apt库进行某些RPC,但是在查看示例并尝试运行一些演示时,总会有接口带有奇怪的未定义构造函数调用。

 @JSONMapper
public interface SampleMapper extends ObjectMapper<SimpleBean> {
    SampleMapper INSTANCE = new App_SampleMapperImpl();
}

来源:https://github.com/DominoKit/gwt-jackson-apt/blob/f60d0358b90bcbf78d066796f680aeae1d7156bb/samples/basic/basic-client/src/main/java/org/dominokit/jacksonapt/samples/basic/App.java

我一直在研究,但是在源代码中的任何地方都没有定义 App_SampleMapperImpl()。而且它没有编译,说有一个未定义的符号

在自述文件的示例中完成了完全相同的操作,可在此页面上找到https://github.com/DominoKit/gwt-jackson-apt/tree/f60d0358b90bcbf78d066796f680aeae1d7156bb

谁能解释这是怎么回事?如何定义或暗示此构造函数?我该怎么做才能编译示例?

2 个答案:

答案 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/

那行得通吗?