ne peut pas créer une session après la réponse a été commis
j'obtiens l'erreur suivante sur mon démarrage de l'application du chargement de la page :
SEVERE: Error Rendering View[/HomeTemplate/equityVolume.xhtml]
javax.el.ELException: /HomeTemplate/equityVolume.xhtml @70,78 value="#{equityBean.scripList}": java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed...
Caused by: java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed...
j'obtiens cette erreur quand j'applique le css de ma page d'accueil, l'erreur disparaît lorsque je supprime le modèle css(mais je veux applique le modèle css)
voici le haricot extrait de code qui provoque l'erreur(trouvé par le débogage)
public List<MasterScrip> getScripList() {
HttpServletRequest req=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); //error line
HttpSession session=req.getSession();
type=(String)session.getAttribute("type");...
code xhtml:
<h:body>
<ui:composition template="commonClientLayout.xhtml">
<ui:define name="contentFile">
<div id="content">
<h:form id="frm">...
lorsque je retire l'ui:composition et de définir des balises(c'est à dire si je n'ai pas d'appliquer le css), alors je n'ai pas cette erreur.
ce pourrait être la cause de cette erreur et comment la résoudre?
édité:
@PostConstruct
void initialiseSession() {
if(type!=null)
{
if(type.equalsIgnoreCase("losers"))
{
scripList=new ArrayList<MasterScrip> ();
scripList=getScripByPriceLosers(exchange);
//return scripList;
}
else if(type.equalsIgnoreCase("gainers"))
{
scripList=new ArrayList<MasterScrip> ();
scripList=getScripByPriceGainers(exchange);
//return scripList;
}
else
{
scripList=new ArrayList<MasterScrip> ();
scripList=getScripByVolumeType(exchange);
// return scripList;
}
}
else
{
scripList=new ArrayList<MasterScrip> ();
scripList=getScripByVolumeType(exchange);
}
}
public List<MasterScrip> getScripList() {
return scripList;
}
réédité:
SEVERE: Error Rendering View[/equityVolume.xhtml]
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:275)...
edit: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Production</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>65535</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>equityVolume.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>Constraint1</display-name>
<web-resource-collection>
<web-resource-name>AdminTemplate</web-resource-name>
<description/>
<url-pattern>/AdminTemplate/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>Constraint2</display-name>
<web-resource-collection>
<web-resource-name>ClientTemplate</web-resource-name>
<description/>
<url-pattern>/ClientTemplate/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>client</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>DataRealm</realm-name>
<form-login-config>
<form-login-page>/equityVolume.xhtml</form-login-page>
<form-error-page>/errorpage.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>admin</role-name>
</security-role>
<security-role>
<description/>
<role-name>client</role-name>
</security-role>
</web-app>
OriginalL'auteur z22 | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas faire les affaires de l'emploi dans les méthodes de lecture. Le faire dans le bean (post)constructeur de la place.
Concrètement, votre problème est causé parce que vous êtes à la demande d'un de relativement grande page sur une nouvelle session de navigateur pour lequel le serveur
HttpSession
n'a pas encore été créé et l'expression EL#{equityBean.scripList}
est référencé relativement tard dans la page.Le tampon de réponse est par défaut de 2 ko et quand il déborde en raison d'une grande réponse, alors il sera commis. Cela signifie que tous les en-têtes de réponse sera envoyée et que les premières ~2 ko de la sortie HTML sera envoyé. Puis, après ce point, l'expression EL
#{equityBean.scripList}
sera résolu dans lequel vous essayez d'obtenir de la session. Si le serveurHttpSession
n'a pas encore été créé à ce moment, le serveur besoins pour définir un cookie dans l'en-tête de réponse afin de le maintenir pour les demandes ultérieures. Mais c'est évidemment pas possible si la réponse a déjà été commis. D'où cette exception.Comme l'a dit, juste faire le travail dans le bean (post)constructeur de la place. Ou tout simplement l'injecter comme propriété gérée.
Si l'exception se produit toujours, vous êtes probablement en utilisant une ancienne version de la Mojarra, qui souffre de bug comme décrit dans les questions Deux mille deux cent quinze et Deux mille deux cent soixante dix sept qui est causée par trop extrême report de la "inutiles" création de session. Cela a été corrigé depuis Mojarra 2.1.8. Ainsi, la mise à niveau ou plus récent (il est actuellement de 2.1.9) devrait le faire.
Sans rapport avec au problème concret, le
getScripList()
logique est par la voie d'odeurs. Mais c'est un sujet pour un autre problème/question. Etes-vous conscient que vous pouvez accéder à l'attribut de session avec le nom "type" en EL que#{type}
? Êtes-vous conscient que d'avoir crujavax.servlet.*
importations dans un JSF backing bean classe le plus souvent d'indiquer que vous êtes probablement mal faire les choses et qu'il y a peut-être plus "JSF-ish" les moyens pour atteindre le béton à l'exigence fonctionnelle?Donc, le haricot est tout simplement pas référencés plus haut dans la page? Ce JSF impl/version utilisez-vous? Un problème similaire a été fixée dans la Mojarra 2.1.8. Sinon, vous pouvez modifier et augmentation de la réponse par défaut taille de la mémoire tampon.
oui, il est mentionné plus haut dans la page xhtml
L'exception indique qu'il n'est pas assez tôt. Apparemment, le point de vue est trop grand. Comme un test rapide, mettre
#{equityBean}
avant la<h:head>
.je suis à l'aide de Mojarra 2.1.3
OriginalL'auteur BalusC
Je ne sais pas ce framework web (est-il JSF?) mais voici ce qui se passe. Votre XHTML commence rendu de la sortie et quelques caractères ont déjà été envoyées au navigateur. Cela implique que l'ensemble de l'en-tête a été envoyé.
Quelque part dans le milieu de votre modèle vous appelez
#{equityBean.scripList}
(BTW faute de frappe) qui s'appelle:Cette méthode permet de créer de la session HTTP, si l'un n'existe pas. L'ID de session doit être envoyé avec la réponse (à l'aide de cookies ou de la réécriture d'URL) vers le client afin d'identifier la session sur les demandes ultérieures. Toutefois, depuis en-têtes de réponse ont déjà été envoyés, le conteneur de servlet n'est pas capable d'envoyer l'id de session dos et lève une exception d'éviter encore plus de problèmes.
Comment pouvez-vous résoudre ce problème? On dirait que vous êtes le rendu de la page pour la première fois quand il n'y a absolument pas de session associé à la demande. Vous pouvez éviter de créer de la session:
Une autre approche consiste à créer de manière proactive la session avant de passer le contrôle de la vue. Cependant, vous devez toujours vérifier la
type
attribut pournull
.OriginalL'auteur Tomasz Nurkiewicz