Действие Seam разрешено на null после проверки в IE

#java #hibernate #jsf #ajax4jsf #seam2

#java #спящий режим #jsf #ajax4jsf #seam2

Вопрос:

Для моего текущего проекта я работаю с JSF, Seam и Hibernate, и у меня проблема с seam.

Я создал XHTML-файл с полем ввода (для productionMonth) и определил для него средство проверки, чтобы обеспечить правильный ввод данных пользователем. Я также включил поддержку ajax в поле, чтобы сделать проверку более удобной для пользователя.

Затем я создал свой класс action (на который ссылается мой XHTML) и добавил свойство ‘productionMonth’ и средство проверки, которое мне нужно.

Теперь, когда я развертываю этот случай, все кажется просто прекрасным. НО: я ввожу значение в поле productionMonth и нажимаю enter, чтобы отправить мою форму. Иногда (когда я достаточно быстр, а мой компьютер работает достаточно медленно) Я получаю исключение:

 Target Unreachable, identifier 'sateiFileHome' resolved to null"
  

Странно то, что

  1. Это воспроизводимо только в IE (я использую IE8)
  2. Когда я удаляю тег поддержки ajax, у меня нет ошибки, поэтому она должна быть действительно связана с ajax

Мое лучшее предположение о причине проблемы заключается в том, что вызов AJAX и отправка запускаются одновременно. И из-за этого один из вызовов не может разрешить ссылку на класс action. Но тогда почему это только в IE?

Я также пытался использовать проверки гибернации, но все та же проблема!

Я погуглил эту проблему, но не могу найти ничего, что мне помогло. Какие-либо догадки здесь?

Мой класс действий:

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

Комментарии:

1. Вы не указали, в каких браузерах оно работает должным образом. Какие браузеры вы все пробовали? Вы также пробовали IE9? Используете ли вы последние версии JSF и Seam? Вы пытались обновить до последней версии? В некоторых ранних версиях могут быть ошибки, связанные с браузером.

Ответ №1:

Помещение компонента в область страницы вместо области диалога решило проблему. Мы использовали область диалога, но мы не покидаем страницу, поэтому мы поняли, что область разговора на самом деле не нужна. Объем страницы достаточен, и это решает проблему. Не спрашивайте меня, почему и как, но это работает.

Комментарии:

1. Причина в том, что вы используете временные диалоги. Вы обновляете поле onchange , которое будет отправлять AJAX-запрос и проходить полный жизненный цикл JSF после каждого нажатия клавиши. Если ваш компьютер работает слишком медленно, он пытается отправить форму, используя старый conversationId. Диалог уже был прерван, и все компоненты, связанные с диалогом, повторно инициализируются.

Ответ №2:

Есть пара вещей, которые я бы попробовал.

1) Следует

  validator=#{sateiFileHome.validateProductionMonth}
  

есть ли кавычки вокруг значения атрибута?

  validator="#{sateiFileHome.validateProductionMonth}"
  

2) Определите, с чего начинается разговор, и действительно ли идет разговор. Тот факт, что это только в IE, вероятно, означает, что это не проблема.

3) Вы пробовали добавлять

 immediate="true"
  

для тега ajax?

4) Вы также можете попробовать перенести проверку в другой класс. Это сделало бы его немного более удобным для использования, и тогда проверка не будет выполняться в компоненте с областью диалога.

5) Вы также можете реализовать свой собственный javax.faces.validator.Валидатор и добавьте его в качестве тега к вашему вводу. Это означало бы, что validator=»#{sateiFileHome.validateProductionMonth}» может быть заменен.

Надеюсь, что здесь что-то поможет.