我正在开发一个长期运行的多模块 Maven Java 项目。我尝试将 PMD 插件从 3.17.0 更新到 3.18.0,但我几乎立即从 PMD 收到 java.lang.NoSuchMethodError。PMD 插件的 3.17.0 版本在此项目上运行良好,但我在发行说明中没有找到任何可以帮助我理解错误的内容。希望这里能理解 PMD 插件或错误,并能引导我找到根本问题。该项目使用 Maven 3.5、JKD 11 构建,编译目标为 JDK8。PMD版本是6.48.0
POM 片段和错误输出如下。
<artifactId>maven-pmd-plugin</artifactId>
<version>${pmd.plugin.version}</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
<goal>cpd-check</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>${skip.analyze}</skip>
<analysisCache>true</analysisCache>
<analysisCacheLocation>${project.build.directory}/pmd/pmd.cache</analysisCacheLocation>
<failOnViolation>false</failOnViolation>
<rulesets>
<ruleset>../ruleset.xml</ruleset>
</rulesets>
<printFailingErrors>false</printFailingErrors>
<linkXRef>false</linkXRef>
<targetJdk>1.8</targetJdk>
</configuration>
<dependencies>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-core</artifactId>
<version>${pmd.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-java</artifactId>
<version>${pmd.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-javascript</artifactId>
<version>${pmd.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-jsp</artifactId>
<version>${pmd.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-apex</artifactId>
<version>${pmd.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-visualforce</artifactId>
<version>${pmd.version}</version>
</dependency>
</dependencies>
</plugin>``` …Run Code Online (Sandbox Code Playgroud) 我有一个具有用户CRUD操作的控制器。
@Controller
public class UserController {
// @TODO need to check whether userId == authUser.id or authUser is admin??
//
@PreAuthorize("hasRole('ROLE_ADMIN) or ...???...")
@PostMapping("/user/{id}/edit")
public boolean editUser(@PathVariable("id") long userId,
@RequestBody User newUserObj,
@CurrentUser authUser) {
// I don't like to always call a helper function from here
// check(authUser.getId() == userId);
return userService.edit(userId, newUserObj);
}
// ... rest of the methods
}
Run Code Online (Sandbox Code Playgroud)
此操作仅允许管理员或用户使用。没有用户可以编辑任何其他人的用户配置文件。
我已经尝试过@PreAuthorize("hasRole('ROLE_ADMIN')),它仅适用于admin用户,但是我想检查通过身份验证的用户是否与参数userId(authUser.getId() == userId)所示的用户相同。如何在注释中定义此表达式?不用编写辅助函数就能做到这一点。
如果需要的话,我还会使用@CurrentUser注释将当前经过身份验证的用户注入到控制器方法中。