gpt4 book ai didi

java - 在 PMD 中使用 JSP 自定义规则

转载 作者:行者123 更新时间:2023-11-30 09:23:27 25 4
gpt4 key购买 nike

我需要一种在 Sonar 上使用的验证,它应该查看 XHTML 页面中的 JSF 元素,验证输入元素是否包含 ID 属性。 (例如:)

最初我尝试使用 PMD 来完成。正如我所见,PMD 可以解释 JSP 页面。这是对的吗?方法是实现基于 AbstractJspRule 的自定义规则。

目前的问题是 PMD 试图将 XHTML 页面解析为 Java 代码。它应该解释为 JSP 页面。

我的代码:
类:

public class TestXhtmlRule extends AbstractJspRule {

@Override
public Object visit(final ASTElement node, final Object data) {
// ...
}

@Override
public Object visit(final ASTAttribute node, final Object data) {
// ...
}

}

xml:

<ruleset name="Basic JSF rules" 
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<include-pattern>**/*.xhtml</include-pattern>

<rule name="idsJSF" language="jsp"
message="..."
class="pmd.rule.TestXhtmlRule">
<description>
...
</description>
<priority>3</priority>

<example>
<![CDATA[
<h:inputText id="itNome" label="Nome" value="#{pessoaBean.nome}" />;
]]>
</example>
</rule>
</ruleset>

日志错误:

[pmd] net.sourceforge.pmd.lang.java.ast.ParseException: Encountered " "<" "< "" at line 1, column 1.
Was expecting one of:
<EOF>
"abstract" ...
"class" ...
"final" ...
"import" ...
"interface" ...
"native" ...
"private" ...
"protected" ...
"public" ...
"static" ...
"synchronized" ...
"transient" ...
"volatile" ...
"strictfp" ...
<IDENTIFIER> ...
";" ...
"@" ...
"\u001a" ...
"~[]" ...
"@" ...
"@" ...
"@" ...

at net.sourceforge.pmd.lang.java.ast.JavaParser.generateParseException(JavaParser.java:9867)
at net.sourceforge.pmd.lang.java.ast.JavaParser.jj_consume_token(JavaParser.java:9751)
at net.sourceforge.pmd.lang.java.ast.JavaParser.CompilationUnit(JavaParser.java:190)
at net.sourceforge.pmd.lang.java.AbstractJavaParser.parse(AbstractJavaParser.java:56)
at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90)
at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:42)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:75)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:22)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

我怎样才能让它发挥作用?
使用 checkstyle 而不是 PMD 验证此规则会更容易吗?

谢谢。

最佳答案

As I've seen PMD can interpret JSP pages. Is it correct?

是的,但前提是您拥有格式良好的 XHTML——您拥有。

How can I make it work?

问题甚至在 PMD 运行您的规则之前就已经发生了。它将文件(无论是 Java 还是 jsp 或其他任何文件)解析为 AST(抽象语法树),然后针对它运行相关规则。您是否在运行 PMD 时传递了 -jsp 标志,如如何使用部分所述at the bottom of the PMD JSP page ?我的猜测是,您并非如此 PMD 将所有内容都视为 Java。

关于java - 在 PMD 中使用 JSP 自定义规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16023337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com