7

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
}

同じコードが1つのシステムで機能していますが、別のシステムでは機能していません。理由は何で、どのように解決すればよいですか?

4

3 に答える 3

12

一部のサーバー構成では、HTTPセッションをハードディスクに保存するか、ネットワーク経由で中央のデータストアに転送する必要があります。多くの場合、クラスター内の複数のサーバー間でセッションを共有したり、過剰なメモリ使用量を最小限に抑えたりすることを目的としています。Serializableこれには、サーバーがObjectOutputStreamJavaオブジェクトをバイトに変換してディスクに保存したりネットワーク経由で転送したりしてそれらのバイトをJavaオブジェクトに変換できるように、すべてのセッション属性を実装する必要がありObjectInputStreamます。

HTTPセッションに格納されているオブジェクトが実装されていないSerializable場合はNotSerializableException、メッセージに完全修飾クラス名が含まれます。次に、クラスを修正して実装する必要がありますSerializable

public class StockOrderBean implements Serializable {
    // ...
}

JSFでは、これはすべてのビューおよびセッションスコープのマネージドBeanに適用されます。リクエストおよびアプリケーションスコープのBeanは、を実装する必要はありませんSerializable。すべてのBeanプロパティもである必要があることに注意してくださいSerializableNotSerializableExceptionしかし、遭遇するたびに十分に明確になります。

于 2012-05-31T13:01:53.753 に答える
0

セッションに追加されるものはすべてシリアライズされます。このエラーは、バッキング Bean がおそらくシリアライズ可能である必要があることを示しています。なぜそれが断続的であるかはわかりません。

于 2012-05-31T09:16:35.493 に答える
0

以下のコードを web.xml に追加してみてください。サーバー側でセッションオブジェクトを保持します。

<context-param>
   <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
   <param-value>server</param-value>
</context-param>
于 2013-02-19T14:11:58.180 に答える