2011-10-12 12 views
3

對於我當前的項目,我正在使用JSF,Seam和Hibernate,並且我遇到了seam問題。在IE中驗證後Seam動作解析爲空

我創建了一個帶有輸入字段(用於productionMonth)的XHTML文件,並且我在其上定義了一個驗證器以確保正確的用戶輸入。我還在該領域啓用了ajax支持,以使驗證更加便於用戶使用。

然後我創建了我的動作類(從我的XHTML引用),並添加了屬性'productionMonth'和我需要的驗證器。

現在,當我部署這種情況下,一切似乎都很好。 但是: 我在productionMonth字段中輸入一個值,然後按回車鍵以提交我的表單。 有時(當我足夠快,我的電腦是夠慢),我得到一個異常:

Target Unreachable, identifier 'sateiFileHome' resolved to null" 

奇怪的是,

  1. 這隻能在IE可再現的(我使用IE8)
  2. 當我刪除了Ajax的支持標籤我沒有錯誤,因此必須是真正的Ajax相關

我最好的問題的原因的猜測是,AJAX調用和提交同時啓動。並且因爲其中一個調用無法解析對動作類的引用。但那爲什麼只在IE中?

我也嘗試使用Hibernate驗證,但仍然是相同的問題!

我googled這個問題,但找不到任何幫助我。 這裏的任何猜測?

我的動作類:

@Name("sateiFileHome") 
@Scope(ScopeType.CONVERSATION) 
public class SateiFileHome extends CustomHome<Satei> { 
    ... 
    private Integer productionMonth = 0; 
    ... 
    public Integer getProductionMonth() { 
     return productionMonth; 
    } 

public void setProductionMonth(Integer productionMonth) { 
    this.productionMonth = productionMonth; 
} 
    ... 
/* VALIDATORS */ 
public void validateProductionMonth(final FacesContext context, 
     final UIComponent comp, final Object inputValue) 
     throws ValidatorException { 
    DateValidator.validateYearMonth(inputValue, false); 
    this.productionMonth = Integer.parseInt(String.valueOf(inputValue)); 
} 
    ... 
} 

我的XHTML文件:

<s:decorate id="productionMonthField" template="layout/edit.xhtml"> 
    <ui:define name="label">Production Month</ui:define> 
    <h:inputText id="productionMonth" 
      value="#{sateiFileHome.productionMonth}" 
      validator=#{sateiFileHome.validateProductionMonth} 
      required="true" 
      size="7" 
      maxlength="6"> 
        <a:support event="onblur" reRender="productionMonthField"/> 
    </h:inputText> 
</s:decorate> 

異常(僅在IE8可重放):

Caused by javax.el.PropertyNotFoundException with message: "/SateiFile.xhtml @123,48 value="#{sateiFileHome.versionCode}": Target Unreachable, identifier 'sateiFileHome' resolved to null" 

並全面stackstrace:

Exception during request processing: 
Caused by javax.servlet.ServletException with message: "/SateiFile.xhtml @123,48 value="#{sateiFileHome.versionCode}": Target Unreachable, identifier 'sateiFileHome' resolved to null" 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:277) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) 
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) 
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
java.lang.Thread.run(Thread.java:619) 
Caused by javax.el.PropertyNotFoundException with message: "/SateiFile.xhtml @123,48 value="#{sateiFileHome.versionCode}": Target Unreachable, identifier 'sateiFileHome' resolved to null" 
com.sun.facelets.el.TagValueExpression.getType(TagValueExpression.java:62) 
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:92) 
com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:188) 
com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:301) 
javax.faces.component.UIInput.getConvertedValue(UIInput.java:942) 
javax.faces.component.UIInput.validate(UIInput.java:868) 
javax.faces.component.UIInput.executeValidate(UIInput.java:1072) 
javax.faces.component.UIInput.processValidators(UIInput.java:672) 
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058) 
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058) 
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1058) 
javax.faces.component.UIForm.processValidators(UIForm.java:235) 
org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:447) 
org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:240) 
org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:463) 
com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) 
org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) 
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) 
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) 
org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:53) 
org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) 
org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
java.lang.Thread.run(Thread.java:619) 
+0

你沒有告訴它在哪個瀏覽器中正常工作。你嘗試過哪些瀏覽器?你也嘗試過IE9嗎?你使用的是最新版本的JSF和Seam?你嘗試升級到最新版本嗎?一些早期版本可能有瀏覽器特定的錯誤。 – BalusC

回答

2

將bean放入頁面範圍而不是對話範圍解決了問題。我們正在使用會話範圍,但我們不會離開頁面,因此我們意識到會話範圍並非真正需要。頁面範圍足以解決問題。不要問我爲什麼和如何,但它的工作原理。

+0

原因是因爲您正在使用臨時對話。您正在更新'onchange'字段,該字段將發送一個AJAX請求,並在每次按鍵之後通過完整的JSF生命週期。如果您的計算機太慢,它會嘗試使用舊的conversationId提交表單。對話已經被終止,所有對話範圍的組件都被重新初始化。 – parasietje

0

我想嘗試一些事情。

1)應

validator=#{sateiFileHome.validateProductionMonth} 

具有的屬性值引號包圍?

validator="#{sateiFileHome.validateProductionMonth}" 

2)找出對話開始的位置,確實存在正在進行的對話。這只是在IE瀏覽器可能意味着這不是問題。

3)您是否嘗試過加入

immediate="true" 

到AJAX標籤?

4)您也可以嘗試將驗證移動到另一個類。這將使它更有用,並且驗證將不在對話範圍的bean上。

5)您也可以實現自己的javax.faces.validator.Validator並將其作爲標記添加到輸入中。這意味着驗證器=「#{sateiFileHome.validateProductionMonth}」可以被替換。

希望在這裏有所幫助。