我正在尝试加载selectOneMenu并提供以下异常:java.lang.IllegalStateException: Cannot create a session after the response has been committed
。
我有xhtml:
<h:outputText value="Nome:" />
<p:selectOneMenu value="" id="nome" >
<f:selectItem itemValue="#{solicitarPortabilidadeBean.listaDoadora}" var="doadora" itemLabel="#{doadora.nomeOperadora}"/>
</p:selectOneMenu>
豆子:
@ViewScoped
@ManagedBean
public class SolicitarPortabilidadeBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Operadora> listaDoadora = null;
private Operadora operadora;
//getters and setters
@EJB
private ConsultasSpnService consultaOp;
public List<Operadora> getListaDoadora() {
if (listaDoadora == null) {
listaDoadora = new ArrayList<Operadora>();
listaDoadora = consultaOp.listarOp();
}
return listaDoadora;
}
public void setListaDoadora(List<Operadora> listaDoadora) {
this.listaDoadora = listaDoadora;
}
public Operadora getOperadora() {
return operadora;
}
public void setOperadora(Operadora operadora) {
this.operadora = operadora;
}
public List<Eot> getListaEot() {
return listaEot;
}
public void setListaEot(List<Eot> listaEot) {
this.listaEot = listaEot;
}
public Eot getEot() {
return eot;
}
public void setEot(Eot eot) {
this.eot = eot;
}
public ConsultasSpnService getConsultaOp() {
return consultaOp;
}
public void setConsultaOp(ConsultasSpnService consultaOp) {
this.consultaOp = consultaOp;
}
}
Operadora类:
public class Operadora {
private String srvprovid = null;
private String nomeOperadora = null;
private String indicadorFuncoes = null;
private String funcaoSuporte = null;
private String tipoTempReceptora = null;
private String tipoTempDoadora = null;
private String horaTrabSuportado = null;
private Long qtdMaximaTn = null;
private String tipoServico = null;
//getters and setters
public String getSrvprovid() {
return srvprovid;
}
public void setSrvprovid(String srvprovid) {
this.srvprovid = srvprovid;
}
public String getNomeOperadora() {
return nomeOperadora;
}
public void setNomeOperadora(String nomeOperadora) {
this.nomeOperadora = nomeOperadora;
}
public String getIndicadorFuncoes() {
return indicadorFuncoes;
}
public void setIndicadorFuncoes(String indicadorFuncoes) {
this.indicadorFuncoes = indicadorFuncoes;
}
public String getFuncaoSuporte() {
return funcaoSuporte;
}
public void setFuncaoSuporte(String funcaoSuporte) {
this.funcaoSuporte = funcaoSuporte;
}
public String getTipoTempReceptora() {
return tipoTempReceptora;
}
public void setTipoTempReceptora(String tipoTempReceptora) {
this.tipoTempReceptora = tipoTempReceptora;
}
public String getTipoTempDoadora() {
return tipoTempDoadora;
}
public void setTipoTempDoadora(String tipoTempDoadora) {
this.tipoTempDoadora = tipoTempDoadora;
}
public String getHoraTrabSuportado() {
return horaTrabSuportado;
}
public void setHoraTrabSuportado(String horaTrabSuportado) {
this.horaTrabSuportado = horaTrabSuportado;
}
public Long getQtdMaximaTn() {
return qtdMaximaTn;
}
public void setQtdMaximaTn(Long qtdMaximaTn) {
this.qtdMaximaTn = qtdMaximaTn;
}
public String getTipoServico() {
return tipoServico;
}
public void setTipoServico(String tipoServico) {
this.tipoServico = tipoServico;
}
我知道错误是在xhtml中调用bean,但我尝试了所有我知道的东西。任何人都可以帮助我吗?
谢谢!!!
答案 0 :(得分:2)
除了代码中严重的逻辑错误之外,反过来在渲染过程中应该没有抛出任何异常,当然不是特别提到的异常,
IllegalStateException:在提交响应后无法创建会话
你的具体问题很可能是由Mojarra的bug引起的,Mojarra 2.1.8修正了这个问题。在提交响应很久之后,在相对较大的JSF页面中第一次“迟到”引用视图作用域或会话作用域bean时,可以显示此错误。
查看和会话范围的bean需要存储在HTTP会话中。为此,如果尚未完成,则需要首先创建HTTP会话(例如,第一次请求)。为此,首先需要将cookie放在HTTP响应头上。为此,响应不应该发送给客户端。默认的响应缓冲区大小通常是2KB,所以如果一个页面大于2KB并且第一次在第一个2KB之后第一次引用了视图或会话范围的bean,那么你将得到这个异常。
至少升级到Mojarra 2.1.8(已经是currently已经是2.1.13),这个问题应该会消失。
答案 1 :(得分:0)
首先,这是您的代码的一个语法问题
<h:outputText value="Nome:" />
<p:selectOneMenu value="" id="nome" >
<f:selectItem itemValue="#{solicitarPortabilidadeBean.listaDoadora}" var="doadora" itemLabel="#{doadora.nomeOperadora}"/>
</p:selectOneMenu>
您没有将value属性绑定到辅助bean。另外IllegalStateException 当你已经提交了回复,意味着写了一些东西,承诺了它 然后将控件传递给另一个servlet或其他东西。在看到正确的ManagedBean之前 代码,很难分辨你在哪里。您的列表如何填充。请发帖 ManagedBean代码并尝试将value属性映射到某个ManagedBean属性。 HTH, 本