2016-10-24 5 views
0

Я хочу использовать некоторый URL-редиректор с аннотациями в приложении JSF 2.2, поэтому я начал играть с Rewrite (PrettyFaces преемником) ,Rewrite/PrettyFaces с параметром вызывает IllegalStateException: не удается создать сеанс после того, как ответ был зафиксирован

Мое приложение все еще просто мир привет, работающий в TomEE 7.x, никаких причудливых зависимостей здесь, я думаю. Я бегу без web.xml, пустым faces-config.xml и пустым beans.xml.

Я создал новый специальный защитный компонент и XHTML, чтобы проверить Rewrite, проблема в том, когда я добавить параметр в URL-адрес, я получаю IllegalStateException: Не удается создать сеанс после того, как ответ был совершен

Я попытался понизить до PrettyFaces 3.3.3, но точно такая же ошибка.

Вот код подкладочного Bean

@Named 
@javax.enterprise.context.RequestScoped 
@URLMapping(id = "testroot", pattern = "/testRoot/#{testRootView.bar}", viewId = "xyz/TestRoot.jsf") 
public class TestRootView implements Serializable { 

    String foo = "my first String"; 

    String bar =""; 

    // getters and setters ... 
} 

и вид

<?xml version="1.0" encoding="UTF-8"?> 
<body jsf:id="root-body" xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
     xmlns:f="http://xmlns.jcp.org/jsf/core" 
     xmlns:jsf="http://xmlns.jcp.org/jsf"> 

<p> 
This is my string : #{testRootView.foo} 
</p> 

<p> 
And this is another string : #{testRootView.bar} 
</p> 

</body> 

и трассировки стека, когда доступ http://localhost:8080/testRoot/aaa

java.lang.IllegalStateException: Не может создать сеанс после ответа org.apache.catalina.connector.Request.doGetSession (Request.java:2952) org.apache.catalina.connector.Request.getSession (Request.java:2361) org.apache.catalina.connector.RequestFacade.getSession (RequestFacade.java:896) javax.servlet.http.HttpServletRequestWrapper.getSession (HttpServletRequestWrapper.java:231) javax.servlet.http.HttpServletRequestWrapper.getSession (HttpServletRequestWrapper.java:231) org.apache.myfaces.context. servlet.SessionMap.setAttribute (SessionMap.java:56) org.apache.myfaces.util.AbstractThreadSafeAttributeMap.put (AbstractThreadSafeAttributeMap.java:109) org.apache.myfaces.util.AbstractThreadSafeAttributeMap.put (AbstractThreadSafeAttributeMap.java:38) org.apache.myfaces.application.viewstate.ServerSideS tateCacheImpl.saveSerializedViewInServletSession (ServerSideStateCacheImpl.java:250) org.apache.myfaces.application.viewstate.ServerSideStateCacheImpl.saveSerializedView (ServerSideStateCacheImpl.java:642) org.apache.myfaces.renderkit.html.HtmlResponseStateManager.saveState (HtmlResponseStateManager.java: 138) org.apache.myfaces.application.StateManagerImpl.saveView (StateManagerImpl.java:279) org.apache.myfaces.shared.view.JspViewDeclarationLanguageBase.renderView (JspViewDeclarationLanguageBase.java:220) org.apache.myfaces.application .ViewHandlerImpl.renderView (ViewHandlerImpl.java:313) com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView (PrettyViewHandler.java:163) javax.faces.application.ViewHandlerWrapper.renderView (ViewHandlerWrapper.java:58) javax.faces.application.ViewHandlerWrapper.renderView (ViewHandlerWrapper.java:58) org.omnifaces.viewhandler.OmniViewHandler.renderView (OmniViewHandler.java:115) org.apache.myfaces.lifecycle.RenderResponseExecutor.execute (RenderResponseExecutor.java : 116) org.apache.myfaces.lifecycle.LifecycleImpl.render (LifecycleImpl.java:267) javax.faces.webapp.FacesServlet.service (FacesServlet.Java: 200) org.apache.tomee.myfaces.TomEEWorkaroundFacesServlet.service (TomEEWorkaroundFacesServlet.java:47) org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52) com.ocpsoft.pretty .PrettyFilter.doFilter (PrettyFilter.java:145) com.ocpsoft.pretty.PrettyFilter.doFilter (PrettyFilter.java:137)

Обратите внимание, что если удалить параметр из шаблона (pattern = "/testRoot") и получить доступ к http://localhost:8080/testRoot нет проблем, и представление хорошо отображается.

Что я делаю неправильно? (Я дал версию с поверхностями, я могу дать один с Rewrite @Join тоже, но я думаю, что проблема в другом месте, так как ошибка такая же ...)

+1

Не могли бы вы проверить, правильно ли установлен атрибут 'viewId'? Вы также должны использовать абсолютный viewId (например, '/ xyz/TestRoot.jsf'). Вы также можете попробовать изменить шаблон, добавив косую черту ('/ testRoot/# {testRootView.bar} /'), потому что некоторые из них содержат довольно странное поведение в некоторых случаях. – chkal

ответ

0

Благодаря chkal, я нашел проблему, действительно, недостаток корня ('/') в поле viewId (или поле to в версии Rewrite).

Добавление этого решения этой проблемы. Мне все еще интересно, где мой код будет искать сеанс для этого и что он сделал бы, если бы нашел один :)

+0

Я думаю, что «проблема сеанса» на самом деле вызвана тем, что Rewrite перенаправляет запрос на недопустимый путь. Может быть, неудачные форварды неправильно обрабатываются где-то. :-) – chkal