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();
}
我一直在挖掘,但在源代码中的任何地方都没有 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 之后的任何版本都将是如果你必须使用旧的就足够了。
正在尝试使用 GWT-Jackson-Apt 库来执行某些 RPC,但是在查看示例并尝试 运行 一些演示时,总是会出现带有奇怪的未定义构造函数调用的接口。
@JSONMapper
public interface SampleMapper extends ObjectMapper<SimpleBean> {
SampleMapper INSTANCE = new App_SampleMapperImpl();
}
我一直在挖掘,但在源代码中的任何地方都没有 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 之后的任何版本都将是如果你必须使用旧的就足够了。