java - 注释处理期间的 GWT RfValidator NPE

标签 java gwt aspectj annotation-processing

使用aspectjweaver 1.11版本和高于1.8.5版本的aspectjrt会导致在使用Java 8构建GWT 1.8.2应用程序期间出现多个NPE:

[INFO] --- aspectj-maven-plugin:1.11:compile (compile) @ myproject ---
...
[ERROR] java.lang.NullPointerException
    at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding.sourceField(FieldBinding.java:437)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.determineSourceStart(TypeElementImpl.java:110)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.getSourceStart(TypeElementImpl.java:74)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:67)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:1)
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360)
    at java.util.TimSort.sort(TimSort.java:234)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.ArrayList.sort(ArrayList.java:1462)
    at java.util.Collections.sort(Collections.java:175)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.getEnclosedElements(TypeElementImpl.java:168)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.isDefaultInstantiable(DomainChecker.java:407)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.visitType(DomainChecker.java:253)
    at com.google.web.bindery.requestfactory.apt.DomainChecker.visitType(DomainChecker.java:44)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.accept(TypeElementImpl.java:139)
    at javax.lang.model.util.ElementScanner6.scan(ElementScanner6.java:146)
    at com.google.web.bindery.requestfactory.apt.ScannerBase.scan(ScannerBase.java:76)
    at com.google.web.bindery.requestfactory.apt.State.executeJobs(State.java:248)
    at com.google.web.bindery.requestfactory.apt.RfValidator.process(RfValidator.java:86)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
    at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:171)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:956)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:451)
    at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:427)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1107)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:276)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:189)
    at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:114)
    at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
    at org.aspectj.tools.ajc.Main.run(Main.java:371)
    at org.aspectj.tools.ajc.Main.runMain(Main.java:248)
    at org.codehaus.mojo.aspectj.AbstractAjcCompiler.execute(AbstractAjcCompiler.java:544)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

这种情况发生在所有 @ProxyFor 类中,这些类是项目外部类的代理(通过 Maven 依赖项解决)。

@ProxyFor(value = ClassOfOtherProject.class)
public interface ClassOfOtherProjectProxy extends EntityProxy { // <- NPE happens in this Line!

    ...

}

摘自 pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <useIncrementalCompilation>false</useIncrementalCompilation>
        <encoding>UTF-8</encoding>
        <annotationProcessors>
            <annotationProcessor>com.google.web.bindery.requestfactory.apt.RfValidator</annotationProcessor>
        </annotationProcessors>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>com.google.web.bindery</groupId>
            <artifactId>requestfactory-apt</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>
</plugin>

仅在aspectjrt 1.8.4(或更低版本)下才能正常运行。我应该怎么办?从 Java 7 迁移到 8 以及 GWT 1.7.x 迁移到 1.8.2 后,这些错误仍然存​​在。如何更新aspectjrt而不获取这些NPE?

最佳答案

这并不是 GWT 编译失败,而只是在将 java 源代码编译为字节码的过程中失败。 GWT 的 RequestFactory 使用注释处理器来验证每个代理是否正确匹配它们在服务器上映射到的实体/值/服务类型,并且此版本的aspectjrt和jdt似乎无法正确查找成员ClassOfOtherProject 的内容,以便可以对其进行过滤以查找构造函数。从您的堆栈跟踪中,com/google/web/bindery/requestfactory/apt/DomainChecker.java:407:

List<ExecutableElement> constructors = ElementFilter.constructorsIn(x.getEnclosedElements());

这是在注释处理器中执行操作的一种非常标准的方法 - 如果调用 TypeElement.getEnclosureElements() 因该注释处理器的 NPE 失败,我也会担心此构建中的其他错误。任何注释处理器都很有可能发生这种情况,与 GWT 无关。

关于java - 注释处理期间的 GWT RfValidator NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976448/

相关文章:

java - layout_weight 没有正确调整大小

java - 使用java将字符串内容传输到远程机器中的文件

java - GWT 语言环境属性 - 用户的新语言需要更多编译

aop - Hystrix 命令不在 Hystrix 环境中运行

java - 如何将从 MongoDB 查询获得的年份和星期转换为 Joda 日期时间?

java - 是否可以使用 RPC 将参数从服务器包传递到客户端包?

java - 动态创建 GWT CellTable

java - 模拟 ProceedingJoinPoint 签名

java - 使用 AspectJ 了解调用者类

java - PMD 的 ArrayIsStoredDirectly 规则背后的推理