2016-10-24 3 views
0

내 JSF 2.2 응용 프로그램에서 주석을 사용하여 URL 재 작성자를 사용하려고하므로 Rewrite (PrettyFaces 후계자) .매개 변수가있는 Rewrite/PrettyFaces가 IllegalStateException을 발생시킵니다. 응답이 커밋 된 후 세션을 만들 수 없습니다.

내 응용 프로그램은 아직도 TomEE 7.x에서 실행되는 안녕하세요. 여기에는 멋진 의존성이 없습니다. 나는 web.xml, 빈 faces-config.xml 및 빈 beans.xml으로 실행됩니다.

내가 URL에 매개 변수를 추가 할 때마다 내가 Rewrite을 테스트 할 수있는 새로운 전용 백업 콩과 XHTML을 만든

이 문제가 , 나는 IllegalStateException 얻을 : 응답이 커밋 된 후에 세션을 만들 수 없습니다

나는 3.332로 PrettyFaces으로 다운 그레이드를 시도했지만 정확히 같은 오류가 발생합니다. 여기

내가 http://localhost:8080/testRoot/aaa

java.lang.IllegalStateException에 액세스 할 때 백업의 콩

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

및 스택 추적입니다 : 할 수 없습니다 응답이 커밋 된 후 세션 만들기 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. (AbstractThreadSafeAttributeMap.java:38) 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) 012 3,516,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 나는 패턴 (pattern = "/testRoot")에서 매개 변수를 제거하고 있다면 액세스하는 것이 .PrettyFilter.doFilter (PrettyFilter.java:145) com.ocpsoft.pretty.PrettyFilter.doFilter (PrettyFilter.java:137)

http://localhost:8080/testRoot 문제가 없으며보기가 잘 렌더링됩니다.

내가 뭘 잘못하고 있니? (나는 prettyfaces로 버전을 주었고 Rewrite의 @Join도 제공 할 수 있습니다. 그러나 문제는 다른 곳의 에러라고 생각합니다 ...)

+1

'viewId' 속성이 올바른지 다시 한번 확인해 주실 수 있습니까? 절대 viewId (예 :'/ xyz/TestRoot.jsf')를 사용해야합니다. 슬래시 ('/ testRoot/# {testRootView.bar} /')를 추가하여 패턴을 변경하려고 할 수도 있습니다. 왜냐하면 일부 구석의 경우 꽤 많이 이상한 동작을하기 때문입니다. – chkal

답변

0

chkal 덕분에 문제가 발견되었습니다. 실제로는 viewId 필드 (또는 Rewrite 버전의 to 필드)에 루트 ('/')가 부족합니다.

추가하면이 문제가 해결됩니다. 나는 여전히 내 코드가 세션을 검색 할 곳이 어디인지 궁금해하고 있는데, 그 중 하나를 찾은 경우 어떻게 했을까?

+0

"세션 문제"는 실제로 재 작성이 잘못된 경로로 요청을 전달한다는 사실에 기인한다고 생각합니다. 전달이 실패 할 수 있습니다 어딘가에 제대로 처리되지 않습니다. :-) – chkal