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

Posted

技术标签:

【中文标题】方法必须具有签名“String method() ...[etc]...”但具有签名“void method()”【英文标题】:Method must have signature "String method() ...[etc]..." but has signature "void method()" 【发布时间】:2011-12-26 09:01:40 【问题描述】:

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

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

在 backing bean 中有这个方法:

public void downloadItem(Item item) 
    // ...

一切正常(单击时执行该方法),但是 Eclipse 验证失败并显示以下奇怪消息:

方法必须有签名“String method(), String method(), String 方法(字符串),字符串方法(字符串,字符串),字符串方法(字符串, 字符串,字符串),字符串方法(字符串,字符串,字符串,字符串),字符串 方法(字符串,字符串,字符串,字符串,字符串),字符串方法(字符串, 字符串,字符串,字符串,字符串,字符串),字符串方法(字符串,字符串, 字符串,字符串,字符串,字符串,字符串),字符串方法(字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串),字符串方法(字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串), 字符串方法(字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串),字符串方法(字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串),字符串 方法(字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串),字符串方法(字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串),字符串方法(字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串),字符串方法(字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串),字符串方法(字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串),字符串方法(字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串),字符串方法(字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串),字符串 方法(字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串, String, String, String)”,但有签名“void method()”

我能做什么?

如果相关,我在 Tomcat 7 上使用 Eclipse Indigo SR1。

【问题讨论】:

【参考方案1】:

忽略它。 Eclipse是个混蛋。您可以通过将 Window > Preferences > Web > JavaServer Faces Tools > Validation > Type Assignment Problems > Method expression signature incompatibility 设置为 WarningIgnore 来调整它>(默认为错误)。

图片从this blog借来,非常礼貌。

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

这个问题在 Eclipse Luna SR1 中得到修复,在该问题被报告近 6 年后。严重性已从 错误 降低到 警告。您可能仍希望将其降低到 Ignore

另见:

Eclipse issue report 243674 Differences between action and actionListener

【讨论】:

谢谢 - 你真是个天才 :-) 我完全同意你对 Eclipse 的判断;) 非常感谢,这个错误非常令人沮丧......而且我看到你是写我正在关注的那些很棒的教程的同一个人,所以也感谢你。 仅供参考:在 IBM 的压力下,这个 Eclipse 问题在本月终于得到了解决。 @BalusC 很好,它已修复,遗憾的是它需要来自 IBM 的压力。显然 WTP 开发人员不使用自己的工具来构建 JSF 应用程序! 根据您令人印象深刻的回答,我相信将方法签名更改为 public String downloadItem(Item item) ...; return null; 会让 Eclipse 满意,而不会改变应用程序的行为,对吧?

以上是关于方法必须具有签名“String method() ...[etc]...”但具有签名“void method()”的主要内容,如果未能解决你的问题,请参考以下文章

具有“iboutlet”属性的属性必须是对象类型(无效的“BOOL”(又名“签名字符”))

多播委托的特点

C#委托初学

如何创建具有可变参数/不同方法签名的方法接口?

Java协变式覆盖(Override)和泛型重载(Overload)

未安装应用程序。具有冲突签名的同名现有包[重复]