ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

无法通过EL传递参数到方法 – javax.el.MethodNotFoundException

2019-10-02 22:02:47  阅读:235  来源: 互联网

标签:java tomcat jsf primefaces el


使用JSF 2.0和EL,我试图在POJO上调用一个方法,POJO是一个viewscoped bean的属性.代码实际上非常类似于@BalusC的教程here.当我调用一个不带参数的方法时,一切都很好.但是当我尝试调用一个带参数的方法时,我得到以下异常:

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException:
/user.xhtml at line 42 and column 32 action="#{users.user.removeFriend(friend)}":
Method not found: model.User@67f2b0dd.removeFriend()

以下是一些更多细节:

user.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{users.id}" />
    <f:event type="preRenderView" listener="#{users.init}" />
</f:metadata>

...

<h:form id="usersForm">
    <p:outputPanel>    
        <p:dataTable id="userTable" value="#{users.user.friendList}" var="friend">
            <p:column>
                <h:outputText value="#{friend.name}" />
            </p:column>
            <p:column>
                <p:commandButton action="#{users.user.removeFriend(friend)}"
                    ajax="true"
                    update="userTable somethingElse" process="@this"
                    one rror="errorDialog.show();"
                    icon="ui-icon-delete"
                    title="delete user">
                </p:commandButton>
            </p:column>
        </p:dataTable>
    </p:outputPanel>

    <p:commandButton action="#{users.user.removeAllFriends()}" ajax="true"
                update="userTable somethingElse"
                process="@this"
                icon="ui-icon-close"
                value="delete all friends?">
    </p:commandButton>


</h:form>

我有以下ViewScoped bean:

Users.java

@ManagedBean(name = "users")
@ViewScoped
public class Users implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;
    private User user;

    @ManagedProperty("#{userService}")
    private UserService userService; // session scoped

    public void init() {
        user = userService.getCart(id);
    }

    public final String getId() {
        return id;
    }

    public final void setId(String id) {
        this.id= id;
    }

    public final User getUser() {
        return user;
    }

    public final void setUser(User user) {
        this.user= user;
    }

    public final void setUserService(UserService userService) {
        this.userService = userService;
    }

}

用户类 – 一个POJO – 有一个私人列表< Friend>朋友属性,使用getter和setter以及公共方法User #removeFriend(Friend f).它有另一种公共方法;用户#removeAllFriends().

页面呈现正常,但是当我单击表中用户旁边的“删除”commandButton时,我得到了异常.

这有什么不对?为什么我可以成功调用无参数方法但不能将参数传递给另一个?

编辑:应用程序部署在Tomcat 7.0上,如果有任何好处的话.

任何帮助赞赏.

更新:正如BalusC和Neo所指出的,这是Tomcat 7.0的一个问题.我安装了WebLogic 12.1,一切正常.

解决方法:

这是Tomcat中的一个错误.它直接在bean上调用方法时有效,但在嵌套属性上调用它时则无效.我记得这个问题是issue 50449,我曾经报道但是因为“对我有用”而被关闭(也许他们没有对它进行非常正确的测试,我没有发现再次与Tomcat人争辩的努力,我还没有和他们有很好的经历).无论如何,我已经将它重新报告为issue 52445,其中包含更加可靠的测试用例 – 我希望如此.

同时,用Glassfish中的另一个替换EL实现应该可以解决.但我可以告诉你,无论你想做什么,都不是真正适当的方法.您已在模型(User实体类)上声明了一个业务方法,而不是在控制器(Users托管bean类)上.这是不对的.该模型应仅用于保存数据.控制器应用于保存业务操作.

我建议按如下方式重写您的案例:

<h:form id="usersForm">
    <p:outputPanel>    
        <p:dataTable id="userTable" value="#{users.user.friends}" var="friend">
            <p:column>
                <h:outputText value="#{friend.name}" />
            </p:column>
            <p:column>
                <p:commandButton action="#{users.removeFriend(friend)}"
                    process="@this" update="userTable somethingElse" one rror="errorDialog.show();"
                    icon="ui-icon-delete" title="delete user" />
            </p:column>
        </p:dataTable>
    </p:outputPanel>

    <p:commandButton action="#{users.removeAllFriends}"
        process="@this" update="userTable numUsers"
        value="delete all friends?" />
</h:form>

并将业务方法放在Users托管bean中:

public void removeFriend(Friend friend) {
    userService.removeFriend(user, friend);
    // ...
}

public void removeAllFriends() {
    userService.removeAllFriends(user);
    // ...
}

UserService也是另一个@ManagedBean并不完全正确.它实际上应该是一个@Stateless EJB,但这是另一个故事.在没有使用例如OpenEJB丰富它的情况下,Tomcat不支持EJB.如果没有EJB,它不一定需要是另一个托管bean.您不希望直接将这些服务公开到视图中.

标签:java,tomcat,jsf,primefaces,el
来源: https://codeday.me/bug/20191002/1844759.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有