3

私の現在のプロジェクトでは、JSF、Seam、および Hibernate を使用していますが、seam に問題があります。

入力フィールド (productionMonth 用) を含む XHTML ファイルを作成し、正しいユーザー入力を保証するためにバリデーターを定義しました。また、フィールドでの ajax サポートを有効にして、検証をよりユーザーフレンドリーにしました。

次に、アクション クラス (XHTML から参照) を作成し、プロパティ 'productionMonth' と必要なバリデータを追加しました。

このケースをデプロイすると、すべて問題ないように見えます。BUT: productionMonth フィールドに値を入力し、Enter キーを押してフォームを送信します。ときどき (私が十分に高速で、PC が十分に遅い場合) 例外が発生します。

Target Unreachable, identifier 'sateiFileHome' resolved to null"

奇妙なことは、

  1. これはIEでのみ再現可能です(私はIE8を使用しています)
  2. ajaxサポートタグを削除するとエラーが発生しないため、本当にajax関連である必要があります

問題の原因に対する私の推測では、AJAX 呼び出しと送信が同時に開始されます。そのため、呼び出しの 1 つがアクション クラスへの参照を解決できません。しかし、なぜIEだけにあるのですか?

Hibernate 検証も使用しようとしましたが、それでも同じ問題です!

この問題をグーグルで検索しましたが、役立つものが見つかりません。ここで推測はありますか?

私のアクションクラス:

@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"

そして完全なスタックトレース:

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)
4

2 に答える 2

2

Bean を会話スコープではなくページスコープに配置すると、問題が解決しました。会話スコープを使用していましたが、ページを離れないので、会話スコープは実際には必要ないことに気付きました。ページ範囲は十分で、問題は解決します。理由と方法は聞かないでください。

于 2011-10-13T07:18:48.110 に答える
0

私が試してみたいことがいくつかあります。

1) すべき

 validator=#{sateiFileHome.validateProductionMonth}

属性値を引用符で囲みますか?

 validator="#{sateiFileHome.validateProductionMonth}"

2) 会話が開始された場所と、実際に会話が進行中かどうかを確認します。IE のみにあるという事実は、おそらくこれが問題ではないことを意味します。

3)追加してみましたか

immediate="true"

ajaxタグに?

4) 検証を別のクラスに移動することもできます。これにより、もう少し使いやすくなり、検証は会話スコープの Bean では行われなくなります。

5) 独自の javax.faces.validator.Validator を実装し、それをタグとして入力に追加することもできます。これは、validator="#{sateiFileHome.validateProductionMonth}" を置き換えることができることを意味します。

ここで何かが役立つことを願っています。

于 2011-10-12T12:11:52.570 に答える