Reputation: 10083
I have the same application in 2 systems(laptops) but it's working in one but not in another.I get the following error in another system. I have also posted the code below. What I want to do is cascading dropdown with a button that calls a method of a different managed bean, and a placeOrder button to add a record in database, but I get the following error at the time of page loading:
WARNING: Setting non-serializable attribute value into ViewMap: (key: stockOrderBean, value class: beans.stockOrderBean)
SEVERE: Error Rendering View[/ClientTemplate/stockTrade.xhtml]
java.io.NotSerializableException: beans.stockOrderBean
WARNING: JSF1087: Unable to generate Facelets error page as the response has already been committed.
SEVERE: javax.faces.FacesException: beans.stockOrderBean
xhtmlcode:
<h:form id="frmTrade">
<h:outputText value="Exchange :"/>
<p:selectOneMenu value="#{stockOrderBean.exchange}" style="width: 200px">
<f:selectItem itemLabel="Select Exchange"/>
<f:selectItem itemLabel="NSE" itemValue="nse"/>
<f:selectItem itemLabel="BSE" itemValue="bse"/>
<p:ajax update="sym" listener="#{stockOrderBean.wow}"/>
</p:selectOneMenu>
<h:outputText value="Select ScripSymbol :"/>
<p:selectOneMenu value="#{stockOrderBean.scripID}" style="width: 200px" id="sym">
<f:selectItem itemLabel="Select scrip"/>
<f:selectItems var="scrip" value="#{stockOrderBean.sl}" itemLabel="#{scrip.scripSymbol}" itemValue="#{scrip.scripID}"/>
</p:selectOneMenu>
<p:commandButton value="Get Quote" actionListener="#{stockOrderBean.equity.setQuote}" oncomplete="cd.show()" update=":frmdialog" />
<h:panelGrid columns="2" id="d1" style="width:565px">
<h:outputText value="How would you like to place order"/>
<p:selectOneRadio value="#{stockOrderBean.transType}">
<f:selectItem itemLabel="Market Order" itemValue="MarketOrder"/>
<p:ajax update="frmTrade:d1"/>
<f:selectItem itemLabel="Limit Order" itemValue="LimitOrder"/>
<p:ajax update="frmTrade:d1"/>
</p:selectOneRadio>
<h:outputText value="Trigger Price"/>
<p:inputText value="#{stockOrderBean.triggerPrice}" disabled="#{stockOrderBean.transType == 'LimitOrder'}"/>
<h:outputText value="Limit Price"/>
<p:inputText value="#{stockOrderBean.limitPrice}" disabled="#{stockOrderBean.transType == 'MarketOrder'}"/>
</h:panelGrid>
<h:outputText value="Select your Demate Account"/>
<p:selectOneMenu value="#{stockOrderBean.demateAccount}" style="width: 120px">
<f:selectItem itemLabel="#{stockOrderBean.demateAccount}" itemValue="#{stockOrderBean.demateAccount}"/>
</p:selectOneMenu>
<p:commandButton value="Place New Order" actionListener="#{stockOrderBean.placeOrder}"/>
<p:commandButton value="Reset New Order" type="reset"/>
</h:form>
<p:dialog widgetVar="cd" header="Scrip Quotes Detail" resizable="true">
<h:form id="frmdialog">
<table>
<tr>
<td>
Ask :
</td>
<td>
<b><h:outputText value="#{stockOrderBean.equity.ask}"/></b>
</td>
</table>
</h:form>
</p:dialog>
sockOrderBean code:
@javax.faces.bean.ManagedBean
@javax.faces.bean.ViewScoped
public class stockOrderBean{
@WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/StatelessWebService/StatelessWebService.wsdl")
private StatelessWebService_Service service;
//properties with getter setter
@ManagedProperty(value="#{equtiyBean}")
private equityBean equity = new equityBean();
public void placeOrder(...){
//method not called
}
The same code is working in one system but not on another. What could be the reason and how do I solve it?
Upvotes: 7
Views: 9621
Reputation: 1109645
Some server configurations need to save HTTP sessions on harddisk or need to transfer them over network to some central datastore, often with the goal to share the session between multiple servers in a cluster, or to minimize excessive memory usage. If you're using the same servers in both machines, then most probably the other machine has too few available memory which forces the server to save sessions on harddisk.
This in turn requires that all session attributes implement Serializable
, so that the server could use ObjectOutputStream
to convert Java objects to bytes which can then be saved on disk or transferred over network and ObjectInputStream
to convert those bytes back to Java objects.
If an object which is stored in the HTTP session does not implement Serializable
, then you will get a NotSerializableException
with the full qualified class name in the message. You should then fix the class to implement Serializable
.
public class StockOrderBean implements Serializable {
// ...
}
In JSF, this applies to all view and session scoped managed beans. Request and application scoped beans don't need to implement Serializable
. Note that all of the bean properties should also be Serializable
. But you will get a clear enough NotSerializableException
whenever one is encountered.
Upvotes: 12
Reputation: 922
Try adding the code below to your web.xml. It will keep session objects on server side.
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
Upvotes: -1
Reputation: 6357
Anything which is added to session is Serialized. The error is telling you that your backing bean should probably be Serializable. No idea why it's intermittent though.
Upvotes: 0