我在2个系统(笔记本电脑)中有相同的应用程序,但它在一个但不在另一个系统中工作.我在另一个系统中得到以下错误.我也发布了下面的代码.我想做的是使用调用不同托管bean方法的按钮级联下拉列表,以及在数据库中添加记录的placeOrder按钮.但是我在页面时遇到以下错误装载
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: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代码:
@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 }
解决方法
某些服务器配置需要在硬盘上保存HTTP会话,或者需要通过网络将它们传输到某个中央数据存储区,通常目标是在群集中的多个服务器之间共享会话,或者最大限度地减少过多的内存使用量.这又要求所有会话属性实现
Serializable
,以便服务器可以使用
ObjectOutputStream
将Java对象转换为字节,然后可以将其保存在磁盘上或通过网络传输,ObjectInputStream
将这些字节转换回Java对象.
如果存储在HTTP会话中的对象未实现Serializable,那么您将在消息中获得带有完全限定类名的NotSerializableException.然后,您应该修复该类以实现Serializable.
public class StockOrderBean implements Serializable { // ... }
在JSF中,这适用于所有视图和会话范围的托管bean.请求和应用程序作用域bean不需要实现Serializable.请注意,所有bean属性也应该是Serializable.但是只要遇到一个,你就会得到足够清晰的NotSerializableException.