JSF中JSTL变量调用ManagedBean方法出现参数签名错误
问题场景
使用JSF开发购物车功能,通过JSTL从数据库读取数据的功能正常,但将<c:forEach>标签的循环变量p传入标注@ManagedBean的ShoppingCartController类的orderNecklace(Product)方法时出现异常;不传递参数时该方法可正常执行。
引发异常的代码
<h:commandButton class="btn btn-success" id="AddToCart" value="add to cart" action="#{shoppingCartController.orderNecklace(p)}" />
错误信息
Method must have signature "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 method(String, String, String, String, String, String, String, String, String), String method(String, 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, String, String)" but has signature "String method(Product)"
控制器代码(ShoppingCartController.java)
package controller; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import model.ProductModel; import entities.Item; import entities.Product; @ManagedBean(name="shoppingCartController") @SessionScoped public class ShoppingCartController { private ProductModel nm = new ProductModel(); private List<Item> cart = new ArrayList<Item>(); public String orderNecklace(Product n){ Item temp = new Item(n,nm.getCurrentUser().getName(),1); this.cart.add(temp); return "cart"; } public List<Item> getCart() { return cart; } public void setCart(List<Item> cart) { this.cart = cart; } }
问题原因
- 核心原因是当前使用的JSF版本不支持传递自定义对象类型作为action方法参数。早期JSF 1.x版本仅允许action方法无参数或接收
String类型参数,无法直接传递自定义的Product对象;只有JSF 2.0及以上版本才支持这种直接传递自定义对象参数的用法。 - 若已使用JSF 2.x版本,可能是项目的EL表达式版本过低(低于EL 2.2),或者项目配置未开启EL 2.2及以上版本的支持,导致无法识别带自定义对象参数的方法调用。
内容的提问来源于stack exchange,提问作者Gal Lisha

