方法必须具有签名“String method() ... [etc] ...”,但具有签名“void method()”。

67

我有一个数据表,每行都有一个按钮:

<ice:dataTable ... var="item">
  <ice:column>
    <h:commandButton value="Download" action="#{mybean.downloadItem(item)}" />
  </ice:column>
</ice:dataTable>

在后端bean中有这个方法:

public void downloadItem(Item item) {
    // ...
}
一切都正常运行(当单击方法时执行),但是Eclipse验证失败,并显示以下奇怪的消息:
方法必须具有签名 "String method(),String method(),String method(String),String method(String, String),String method(String, String, String),String method(String, String, String, String),String method(String, String, String, String, String),String method(String, String, String, String, String, String),String method(String, String, String, String, String, String, String),String method(String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String), String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String,String method(String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)”,但是实际上签名为“void method()”。
我该怎么办?
如果相关的话,我正在使用Tomcat 7上的Eclipse Indigo SR1。
1个回答

136

忽略它,Eclipse有点莫名其妙。你可以通过设置Window > Preferences > Web > JavaServer Faces Tools > Validation > Type Assignment Problems > Method expression signature incompatibilityWarningIgnore(默认为Error)来解决。

enter image description here

图片来源于这篇博客,感谢作者。

原因是,Eclipse希望action属性始终返回String,而不是void。虽然在JSF的action属性中未指定,但EL方法表达式本身也支持void方法。过度热情的错误信息提示表明,负责此验证的底层逻辑无法确定各个方法参数,因此尝试将原始方法签名与允许的签名集合进行比较,如果没有匹配,则最终在消息中显示。根据消息,当该方法具有20个或更多参数时,此问题也可能消失 ;)

这在Eclipse Luna SR1中得到了解决,近6年后才解决了此问题。其严重性已从Error降低为Warning。您可能还希望将其降低到Ignore

另请参阅:


1
谢谢 - 你真是个天才 :-) 我完全同意你对Eclipse的评价 ;) - hugri
8
非常感谢,这个错误真是令人沮丧……另外我发现你就是写那些我正在学习的非常棒的教程的人,所以也谢谢你。 - Asaf
1
FYI:在IBM的压力下,这个Eclipse问题终于在本月得到了解决。 - BalusC
@BalusC 很好,问题已经解决了,但需要IBM的压力才能解决。很明显WTP开发人员不使用自己的工具来构建JSF应用程序! - dexter meyers
根据您出色的回答,我相信将方法签名更改为public String downloadItem(Item item) { ...; return null; }会使Eclipse满意,而不会改变应用程序的行为,对吗? - MestreLion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接