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

GWT-Jackson-Apt seemingly undefined class constructor call

正在尝试使用 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() 的定义。而且编译不通过,说有undefined symbol

可以在本页找到的自述文件示例中完成了完全相同的事情:https://github.com/DominoKit/gwt-jackson-apt/tree/f60d0358b90bcbf78d066796f680aeae1d7156bb

谁能解释一下这是怎么回事?这个构造函数是如何定义或暗示的?我需要做什么才能使示例编译?

按照项目主页上的示例:https://github.com/DominoKit/gwt-jackson-apt/

这样行吗?

假设您正在制作一个 Maven 项目,重要的是包括生成映射器的注释处理器。然后,一旦项目知道如何生成它们,您就可以在代码中使用它们。

注释处理器 运行 编译器 运行ning,这意味着从技术上讲,您编写的代码似乎不会编译。然后,由于编译器是 运行ning,它要求所有已注册的注解处理器根据注解和现有类型生成代码(不是 缺少的引用,如 App_Sample_MapperImpl 如你所想)。处理器然后 运行s,生成缺失的 class,然后编译继续。

通常发生的情况是您在编写代码时进行构建(例如,eclipse 会在每次保存文件时执行此操作,intellij 在您请求构建​​时执行此操作,等等),然后 class 存在并且以后可以参考。即使项目被清理和重建,虽然参考似乎不应该工作,但它会在编译器 运行s.

后立即工作。

在这种情况下,我们需要按照示例来确保处理器存在。在 https://github.com/DominoKit/gwt-jackson-apt/blob/f60d0358b90bcbf78d066796f680aeae1d7156bb/samples/shared-mappers/shared-mappers-shared/pom.xml 中,我们在依赖项中看到了这一点:

    <dependency>
      <groupId>org.dominokit.jackson</groupId>
      <artifactId>jackson-apt-processor</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>provided</scope>
    </dependency>

这被标记为scope=provided,因为它只需要编译,因此不应包含在以后的依赖关系图中。对于每个特定的 IDE,您可能需要指定其他选项以使其自动重新 运行(Eclipse 中的一个复选框,我相信 IntelliJ 中没有,我没有使用其他 IDE 说得太久了)。

maven 的最后一个注意事项:您必须使用相对较新的 maven-compiler-plugin,以便正确处理生成的代码:最新版本是 3.8.0,发布于 2018 年 7 月,但我认为 3.5.1 之后的任何版本都将是如果你必须使用旧的就足够了。