我试图从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