警告:将不可序列化的属性值设置为 ViewMap,后跟 java.io.NotSerializableException



我在 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: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>           

袜子订购豆代码:

    @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

另请参阅:

  • java.io.WriteAbortedException: write aborted; java.io.NotSerializableException
  • 为什么Java Beans必须是可序列化的?

添加到会话的任何内容都是序列化的。该错误告诉您,您的后备 Bean 可能应该是可序列化的。不知道为什么它是间歇性的。

尝试将以下代码添加到您的 web.xml。它将会话对象保留在服务器端。

<context-param>
   <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
   <param-value>server</param-value>
</context-param>

最新更新