迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

Posted

技术标签:

【中文标题】迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败【英文标题】:Passing enum value as parameter to bean method from JSF pages fail after migrating to tomcat 【发布时间】:2012-03-21 00:07:51 【问题描述】:

我最近将我的 JSF 应用程序(使用 primefaces)从 glassfish 3.1 迁移到了 tomcat7 服务器。以前通过actionlistener 属性将枚举值作为字符串传递给托管bean 方法有效(无需转换器将字符串转换为枚举),但现在它因javax.el.MethodNotFoundException 而失败。

JSF 页面:

<h:form>
   <h:outputLabel value="Title"/><br/>
   <p:inputText value="#lobController.current.title"/>

   <p:commandButton action="#lobController.create('CAR')" value="Post"/>
</h:form>

托管bean方法

public void create(Type type) 
  ...

日志消息:

javax.el.MethodNotFoundException: /_newLOB.xhtml @85,111 action="#lobController.create('CAR')":找不到方法: d432.xontrollers.LOBController@15b2cec.create(java.lang.String) 在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:110) 在 javax.faces.component.UICommand.broadcast(UICommand.java:315) 在 javax.faces.component.UIData.broadcast(UIData.java:1093) 在 javax.faces.component.UIData.broadcast(UIData.java:1093) 在 javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 在 javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 在 com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)


编辑

如果我按以下方式更改托管 bean 方法,这将开始工作:

public void create(String type) 
     Type type = Type.valueOf(type);
     ...


在 Tomcat 7.0.14 上使用 Primefaces 3.1 和 JSF 2.1.6

【问题讨论】:

【参考方案1】:

这是 Tomcat 的 EL 实现中的一个错误。我已经为您报告了:issue 52970。希望他们不会像我之前的报告那样挑剔。

在他们修复它之前,最好的办法是将Glassfish 3's EL 2.2 implementation JAR file 的副本放到您的 web 应用程序的 /WEB-INF/lib 中,并通过 web.xml 中的以下条目告诉 Mojarra 使用它:

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>   
</context-param>

更新:工单中提到它已修复,将在 7.0.27 及以后版本。

【讨论】:

以上是关于迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败的主要内容,如果未能解决你的问题,请参考以下文章

将枚举值作为参数的通用 C# 方法[重复]

GraphQL - 将枚举值作为参数直接传递给突变?

java springmvc 页面枚举类型作为怎样查询条件并传递参数到controller

如何将 vue.js 值作为参数传递给刀片中的路由

如何将 SSL 从 Tomcat 迁移到 Apache HTTPD?

无法将 JSF + CDI 项目从 Tomcat 迁移到 Wildfly