서블릿에서 다음과 같은 코드 비트를 사용하여 최근까지 문제없이 BalusC가 제안한 세션 백업 빈을 찾습니다. 이제는 Internet Explorer에서만 작동합니다. Chrome과 Firefox는 원래의 백업 빈보다 완전히 새로운 백업 빈을 얻는 것으로 보입니다. Backing Bean에서 함수를 호출 할 때 원래 bean에서 확실히 초기화 된 backing bean의 오브젝트에 대한 널 포인터 오류로 넘어집니다.IE가 아닌 다른 브라우저를 사용할 때 세션 범위가 설정된 관리 빈을 Servlet에서 사용할 수 없음
FacesContext facesContext = FacesUtil.getFacesContext(req, res);
ProductSelection productSelection = (ProductSelection) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{productSelection}", ProductSelection.class);
if(productSelection.getProductType() == null)
{
System.out.println("Sevlet: product type is NULL; did not get the original backing bean");
}
else
{
System.out.println("Sevlet: product type is: " + productSelection.getProductType().getProductTypeName());
}
이 코드를 테스트하고 Java에 대한 몇 가지 업데이트가 있었지만 그 원인인지 확실하지 않습니다. 내 구성에서 뭔가를 변경했거나 Chrome 및 Firefox가 코드에서 변경된 것 같습니다 (있을 법하지 않음). 비슷한 문제가있는 사람이 있습니까? 나는 거기에서 어디로 가야할지에 관해서는, 어떤 오류가 보이지 않는 것처럼 자바 빈 코드에 대한 뒷받침 빈과 디버깅 기술을 찾지 못하는 것과 관련이 없다 (그들은 코드를 주석 처리하지 않는다. 아주 잘 그것은 따를 것이 곤란하다); 어떤 제안이라도 대단히 감사하겠습니다.
Netbeans 7.01, JSF 2.0, Glassfish 3.1 및 Derby 데이터베이스를 사용하고 있습니다. 필자는 필자의 타워와 랩톱에서 테스트를 실시했으며, Windows XP와 Win 7 모두에서이 작업을 수행하고 있습니다. JRE는 7 업데이트 40 빌드 1.7.0_40-b43입니다. JDK는 1.6.0_04입니다. Chrome 버전은 29.0.1547.76 m입니다. Firefox는 23.0.1입니다. Internet Explorer는 8.0.6001.18702입니다.
FacesUtil는 (하지만이 일하고 잘) BalusC의 코드를 약간 다릅니다 : 사전에
package searchselection;
import javax.faces.FactoryFinder;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.FacesContextFactory;
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
// By BalusC http://balusc.blogspot.com
// Utility to get the FacesContext.
// Used by the CriteriaServlet to get the backing bean when the user submits a customised
// search criteria object.
public class FacesUtil
{
// Getters -----------------------------------------------------------------
//
public static FacesContext getFacesContext(ServletRequest request, ServletResponse response)
{
// Get current FacesContext.
FacesContext facesContext = FacesContext.getCurrentInstance();
// Check current FacesContext.
if (facesContext == null)
{
// Create new Lifecycle.
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
// Create new FacesContext.
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
facesContext = contextFactory.getFacesContext(
request.getServletContext(), request, response, lifecycle);
// Create new View.
UIViewRoot view = facesContext.getApplication().getViewHandler().createView(
facesContext, "");
facesContext.setViewRoot(view);
// Set current FacesContext.
FacesContextWrapper.setCurrentInstance(facesContext);
}
return facesContext;
}
// Helpers -----------------------------------------------------------------
// Wrap the protected FacesContext.setCurrentInstance() in a inner class.
private static abstract class FacesContextWrapper extends FacesContext
{
protected static void setCurrentInstance(FacesContext facesContext)
{
FacesContext.setCurrentInstance(facesContext);
}
}
}
종류 덕분에 ...
브라우저간에 JSESSION_ID에 변경 사항이 있습니까? – kolossus
안녕하세요. Kolossus, 도와 주셔서 감사합니다. 문제가 발생하기 전에 JSESSIONID 쿠키를 확인하고 쿠키 값은 Chrome 및 Firefox에서 변경되지 않은 채로 남아 있습니다 (사용자가 묻는 것으로 가정합니다. 내 무지를 용서하십시오. 사용자가 언급 할 때까지 JSESSIONID가 존재한다는 것을 전혀 알지 못했습니다.). Internet Explorer 8에서 쿠키를 볼 때 찾은 지침이 올바르지 않아 잘 모르겠지만 작동 중입니다 ... – Robbie62
req.getSession(). getAttribute ("productSelection")'은 무엇을 제공합니까? 'req.getSession(). getId()'는 JSF에서 bean이 처음으로 생성되었을 때와 정말로 동일합니까? – BalusC