javax.faces.FacesException: Expression Error: Named Object: myConverter not found

javax.faces.FacesException: Expression Error: Named Object: myConverter not found

我相信我所有的接线都正确,但转换器在我的 xhtml 中仍然无法识别,我有以下代码:

<p:selectOneMenu ... value="#{myBean.myObject}" converter="myConverter">
  ...
</p:selectOneMenu>

其中 myConverter 是我用来对 myObject 对象执行 Object - StringString - Object 转换的转换器([=19= 类型的实例) ] 下面)。

这是 myConverter 代码的相关部分:

@FacesConverter (value="myConverter", forClass = MyType.class)
public class MyConverter implements Converter {
  ...
}

尽管有上面的配置,我还是得到了错误:

javax.faces.FacesException: Expression Error: Named Object: myConverter not found

我提到了 similar question(缺少上述配置),它建议通过修改 faces-config.xml 来替代,但我认为上述配置应该也能正常工作?无论如何,我也尝试了 xml 方法 - 这是配置的相关部分:

<faces-config ...>
    <converter>
      <converter-id>myConverter</converter-id>
      <converter-class>myPackage.MyConverter</converter-class>
    </converter>
</faces-config>

配置真的有问题吗?我看到示例 here 做完全相同的事情!

编辑: 好的,堆栈跟踪揭示了一些更有用的信息:

javax.faces.FacesException: Expression Error: Named Object: myConverter                  not found.

我看到转换器名称(转换器 ID)后有多余的空格;我试图在远程调试期间修改它的值以删除末尾的空格,它找到了我的转换器(虽然后来我遇到了 NPE,但我想我可以接受它)!关于为什么将这些空格附加到我的转换器名称(或 id)的末尾有什么明显的吗?

好的,我找到了导致在转换器 ID 末尾插入额外空格的原因。

这是我之前的确切代码:

<p:selectOneMenu ... converter="myConverter"
  filter="true" filterMatchMode="contains" editable="false">

我改成了:

<p:selectOneMenu ...
  converter="myConverter" filter="true" filterMatchMode="contains" editable="false">

注意新行中的转换器属性!我不确定我是否遗漏了关于属性的 formatting/rendering 规则的一些明显的东西,但至少可以说这种行为似乎很尴尬!