#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"
Странно то, что
- Это воспроизводимо только в IE (я использую IE8)
- Когда я удаляю тег поддержки 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}» может быть заменен.
Надеюсь, что здесь что-то поможет.