我目前的平台是NB 7 rc 1,我有一个只有一个“托管bean”的JSF 2应用程序。最后,我正在使用Tomcat 7.0.34。
以下是发生错误的代码:
@ManagedBean
@SessionScoped
public class CopyController implements Serializable {
private static final long serialVersionUID = 1L;
private String pathBancoSentencas;
private List<Arquivo> arquivosUpload;
private HttpSession session;
private List<String> listaPdfs;
public List<Arquivo> getArquivosUpload() {
return arquivosUpload;
}
public void setArquivosUpload(List<Arquivo> arquivosUpload) {
this.arquivosUpload = arquivosUpload;
}
public CopyController() {
arquivosUpload = new ArrayList<Arquivo>();
}
@PostConstruct
public void doInit() {
session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
pathBancoSentencas = (String)session.getAttribute("DIRETORIO_TRABALHO");
}
处理完请求后,例程调用如下视图:
<p:dataTable value="#{copyController.arquivosUpload}" var="arquivo" paginator="true" paginatorPosition="bottom"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}">
<f:facet name="header">
Item processado
</f:facet>
<h:column>
<h:outputText value="#{arquivo.nome}" />
</h:column>
</p:dataTable>
但是,视图不会显示,并且会发生此错误:
Caused by: java.lang.NullPointerException
at br.jus.tjmg.dspace.copy.CopyController.doInit(CopyController.java:54)
... 70 more
有人能帮助我吗? 谢谢!
答案 0 :(得分:4)
使用doInit()
方法
getExternalContext().getSession(false);
如果当前尚未创建会话,则返回null
。但是你明确地期待下一行中的非null
会话。
您需要传递true
才能触发自动创建。
getExternalContext().getSession(true);
另见javadoc(强调我的):
如果
create
参数为true
,则创建(如有必要)并返回与当前请求关联的会话实例。如果create
参数为false
,则返回与当前请求关联的任何现有会话实例,如果没有此类会话,则或返回null
。
无关,整个doInit()
方法是不必要的,可以用@ManagedProperty
代替:
@ManagedProperty("#{DIRETORIO_TRABALHO}")
private String pathBancoSentencas;
或者,如果您在doInit()
中确实需要这样做,那么更好的方法是从ExternalContext#getSessionMap()
获取它。
pathBancoSentencas = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("DIRETORIO_TRABALHO");
您应该尝试在您的JSF辅助bean中避免 javax.servlet.*
导入。