Mojarra 2.2.6和EL 3.0: h:commandButton动作属性中的参数数量错误



我试图从JSF命令按钮调用bean方法,但我一直得到一个错误

javax.faces.FacesException: wrong number of arguments

这是我的页面中的代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:dmx="http://java.sun.com/jsf/composite/dmx"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <head>
        <title>TODO supply a title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>
    <body>
        <ui:composition>
        <h:form>
        <div id="child"></div>
        <h:panelGroup>
            <h:outputText value="Hello, DEMUX JSF!" 
                style="color: #{dmxAdapter.model.get('testData') ? 'green' : 'red' }" />
            <h:commandButton value="Click me" 
                action="#{dmxAdapter.invokeController('com.vektorsoft.demux.samples.hello.HelloController')}"  />
        </h:panelGroup>
        </h:form>
        </ui:composition>
    </body>
</html>

如果我将action属性更改为不带参数的调用方法,一切都可以正常工作。我在Jetty中运行这个OSGI容器。JSF版本为Mojarra 2.2.6和EL 3.0。

我读过很多回答,提到EL 2.2及以上需要这个工作,我认为EL 3.0也应该工作。这是作为Maven依赖项添加的:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.0</version>
</dependency>

有谁能告诉我这里有什么问题吗?

正如您的方法(public void invokeController(String controllerId, Object... args))的签名所说,您的方法中有变量,这是EL不支持的。

您的servlet容器是EL 3.0兼容的,因此从视图传递参数没有问题。然而,你需要修改你的方法的签名,使其完全兼容。

参见:

  • https://stackoverflow.com/a/15561064/1199132

最新更新