我在 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
xhtml代码:
<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 session 保存在硬盘上,或者需要通过网络将它们传输到某个中央数据存储区,通常目的是在集群中的多个服务器之间共享 session ,或者尽量减少过多的内存使用。这又要求所有 session 属性实现 Serializable以便服务器可以使用 ObjectOutputStream将 Java 对象转换为字节,然后可以将其保存在磁盘上或通过网络传输 ObjectInputStream将这些字节转换回 Java 对象。
如果存储在 HTTP session 中的对象没有实现 Serializable,那么您将在消息中得到一个带有完整限定类名的 NotSerializableException。然后,您应该修复该类以实现 Serializable。
public class StockOrderBean implements Serializable {
// ...
}
在 JSF 中,这适用于所有 View 和 session 范围内的托管 bean。请求和应用范围的 beans 不需要实现 Serializable。请注意,所有 bean 属性也应该是 Serializable。但无论何时遇到,您都会得到一个足够清晰的 NotSerializableException。
关于java - 错误 : non-serializable attribute value into ViewMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10829734/