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

时间:2012-03-02 13:30:21

标签: java jsf tomcat el converter

我最近将我的JSF应用程序(使用primefaces)从glassfish 3.1迁移到tomcat7服务器。以前通过actionlistener属性将enum值作为字符串传递给托管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)at   com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:110)     在javax.faces.component.UICommand.broadcast(UICommand.java:315)at   javax.faces.component.UIData.broadcast(UIData.java:1093)at   javax.faces.component.UIData.broadcast(UIData.java:1093)at   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)at   com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)     在javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)at   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 个答案:

答案 0 :(得分:13)

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

在他们修复之前,最好的办法是在您的网络应用/WEB-INF/lib中删除Glassfish 3's EL 2.2 implementation JAR file的副本,然后通过web.xml中的以下条目告诉Mojarra使用它:< / p>

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

更新:该票证提到它已修复,并且将在7.0.27及之后。