2009-08-13 6 views
0

私たちは、サーバー(jboss.4.2.1.GA)側にスイングクライアントとJavaアプリケーションを持つアプリケーションを持っています。私たちはejb3を使用しています。 私たちのアプリケーションでは、ある時点でインボイスを作成してユーザーに表示していますが、ユーザーがインボイスを変更する場合は、次のエラーが発生します。再読み込み後、請求書のユーザーは何のエラーもなく請求書を変更することができます。以下のように 請求書作成コード、請求書の変更及びフルエラー・スタックは、次のとおり問題を保存またはアップデート

public Invoice createInvoice(String invoiceNo, CreateInvoiceGroupTemplate template, Collection serviceCalculations) 
     throws Exception 
{ 
    manager.setFlushMode(FlushModeType.COMMIT); 

    if (glDao.isInvoiceNoInUse(manager, invoiceNo)) 
     throw new NonUniqueInvoiceNoException(invoiceNo); 

    Invoice invoice = new Invoice(); 
    invoice.setNo(invoiceNo); 
    invoice.setInvoiceDate(template.getMinimumInvoiceDate()); 
    Date paymentDay = findInvoicePaymentDay(template); 
    invoice.setPaymentDate(paymentDay); 
    invoice.setFormBeginDate(template.getFormBeginDate()); 
    invoice.setFormEndDate(template.getFormEndDate()); 

    Currency currency = new Currency(); 
    currency.setId(template.getCurrencyId()); 
    invoice.setCurrency((Currency) dao.findByPrimaryKey(manager, currency)); 

    Customer customer = new Customer(); 
    customer.setId(template.getCustomerId()); 
    invoice.setCustomer((Customer) dao.findByPrimaryKey(manager, customer)); 

    if (template.getRepresentativeId() > 0) 
    { 
     Representative representative = new Representative(); 
     representative.setId(template.getRepresentativeId()); 
     invoice.setRepresentative((Representative) dao.findByPrimaryKey(manager, representative)); 
    } 

    if (template.getAccountingGroupId() != 0) 
    { 
     AccountingGroup accountingGroup = new AccountingGroup(); 
     accountingGroup.setId(template.getAccountingGroupId()); 
     invoice.setAccountingGroup((AccountingGroup) dao.findByPrimaryKey(manager, accountingGroup)); 
    } 

    if (template.getAirlineGroupId() > 0) 
    { 
     AirlineGroup airlineGroup = new AirlineGroup(); 
     airlineGroup.setId(template.getAirlineGroupId()); 
     invoice.setAirlineGroup((AirlineGroup) dao.findByPrimaryKey(manager, airlineGroup)); 
    } 

    if (template.getAirportId() != 0) 
    { 
     Airport airport = new Airport(); 
     airport.setId(template.getAirportId()); 
     invoice.setAirport((Airport) dao.findByPrimaryKey(manager, airport)); 
    } 

    //automatically create new address based on the last invoice for this customer and representative 
    InvoiceAddress oldInvoiceAddress = glDao.findAddressForLastInvoice(manager, invoice); 
    if (oldInvoiceAddress != null) 
    { 
     InvoiceAddress invoiceAddress = (InvoiceAddress) oldInvoiceAddress.copyEntity(); 
     invoice.setInvoiceAddress(invoiceAddress); 
    } 

    HashMap invoiceDetails = new HashMap(); 
    String key = ""; 

    try 
    { 
     Collection mappings = invoice.getInvoiceMappings(); 
     InvoiceMapping invoiceMapping = null; 
     ServiceCalculation serviceCalculation = null; 
     ServiceCalculation refreshedServiceCalculation = null; 
     Iterator itr = serviceCalculations.iterator(); 
     while (itr.hasNext()) 
     { 
      serviceCalculation = (ServiceCalculation) itr.next(); 
      invoiceMapping = new InvoiceMapping(); 

      refreshedServiceCalculation = (ServiceCalculation) dao.findByPrimaryKey(manager, serviceCalculation); 
      refreshedServiceCalculation.setInvoiced(true); 
      refreshedServiceCalculation.setVatRateModified(serviceCalculation.isVatRateModified()); 

      if (refreshedServiceCalculation instanceof CalculatedService) 
       invoiceMapping.setCalculatedService((CalculatedService) refreshedServiceCalculation); 
      else if (refreshedServiceCalculation instanceof CalculatedRoyalty) 
       invoiceMapping.setCalculatedRoyalty((CalculatedRoyalty) refreshedServiceCalculation); 
      else if (refreshedServiceCalculation instanceof CalculatedCommission) 
       invoiceMapping.setCalculatedCommission((CalculatedCommission) refreshedServiceCalculation); 

      mappings.add(invoiceMapping); 

      serviceCalculation = (ServiceCalculation) dao.saveOrUpdateEntity(manager, refreshedServiceCalculation); 

      key = createKey(serviceCalculation); 
      processInvoiceDetail(invoiceDetails, key, serviceCalculation); 
     } 

     ArrayList processedInvoiceDetails = clearInvoiceDetails(invoiceDetails.values()); 
     invoice.getInvoiceDetails().addAll(processedInvoiceDetails); 

     updateExchangeRate(invoice); 

     invoice = (Invoice) dao.saveOrUpdateEntity(manager, invoice); 

     glDao.initializeInvoice(invoice); 
    } 
    catch (ApplicationException exc) 
    { 
     logger.error(exc); 
     ctx.setRollbackOnly(); 
     throw exc; 
    } 
    catch (Exception exc) 
    { 
     logger.error(exc); 
     ctx.setRollbackOnly(); 
     throw exc; 
    } 

    return invoice; 
} 

public ServerResponse synchronizeInvoice(GridData gridData) throws Exception 
{ 
    ServerResponse response = new ServerResponse(); 

    try 
    { 
     manager.setFlushMode(FlushModeType.COMMIT); 

     Invoice loadedInvoice = null; 

     //boolean invoiceRemoved=false; 

     Collection entitiesToRemove = gridData.getGarbageData(); 
     Iterator itr = entitiesToRemove.iterator(); 
     Object temp = null; 
     Invoice invoice = null; 
     InvoiceDetail invoiceDetail = null; 
     while (itr.hasNext()) 
     { 
      temp = itr.next(); 

      if (temp instanceof Invoice) 
      { 
       invoice = (Invoice) temp; 
       loadedInvoice = (Invoice) dao.findByPrimaryKey(manager, invoice); 
       if (loadedInvoice.getStatus() == Invoice.INVOICE_FINALIZED 
         || loadedInvoice.getStatus() == Invoice.INVOICE_CANCELLED) 
        throw new InvoiceFinalizedException(); 
       else 
       { 
        updateMappingsAsNotInvoiced(invoice); 
        dao.removeEntity(manager, invoice); 
       } 
      } 
      else 
      { 
       //instance of invoice detail 
       invoiceDetail = (InvoiceDetail) temp; 
       dao.removeEntity(manager, invoiceDetail); 
      } 
     } 

     Collection updatedEntity = gridData.getNewUpdatedBuffer(); 
     updatedEntity.addAll(gridData.getUpdatedBuffer()); 

     itr = updatedEntity.iterator(); 
     if (itr.hasNext()) 
     { 
      temp = itr.next(); 
      invoice = (Invoice) temp; 
      loadedInvoice = (Invoice) dao.findByPrimaryKey(manager, invoice); 
      if(loadedInvoice!=null) 
      { 
       if ((loadedInvoice.getStatus() == Invoice.INVOICE_FINALIZED && invoice.getStatus() != Invoice.INVOICE_CANCELLED) 
         || loadedInvoice.getStatus() == Invoice.INVOICE_CANCELLED) 
        throw new InvoiceFinalizedException(); 
       else 
       { 
        if (invoice.getStatus() == Invoice.INVOICE_FINALIZED) 
        { 
         JMSHelper helper = new JMSHelper(); 
         helper.sendMessage("queue/InvoiceFinalizeEvent", invoice); 
         finalizeInvoice(invoice); 
        } 
        else if (invoice.getStatus() == Invoice.INVOICE_CANCELLED) 
        { 
         JMSHelper helper = new JMSHelper(); 
         helper.sendMessage("queue/InvoiceFinalizeEvent", invoice); 
         cancelInvoice(invoice); 
        } 
        else 
        { 
         updateExchangeRate(invoice); 
         invoice=(Invoice) dao.saveOrUpdateEntity(manager, invoice); 
        } 

        response.addData(invoice); 
       } 
      }    
     } 
     else 
     { 
      Iterator synchronizedData=gridData.getSynchBuffer().iterator(); 
      if(synchronizedData.hasNext()) 
      { 
       invoice = (Invoice) synchronizedData.next(); 
       response.addData(invoice); 
      } 
     } 
    } 
    catch (ApplicationException exc) 
    { 
     ctx.setRollbackOnly(); 
     response.addException(exc); 
     return response; 
    } 
    catch (Exception exc) 
    { 
     ctx.setRollbackOnly(); 
     throw exc; 
    } 

    return response; 
} 

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Lorg/hibernate/type/AbstractComponentType; 
at java.lang.Class.getDeclaredFields0(Native Method) 
at java.lang.Class.privateGetDeclaredFields(Class.java:2291) 
at java.lang.Class.getDeclaredField(Class.java:1880) 
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1610) 
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52) 
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:425) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:413) 
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310) 
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:547) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
at java.util.ArrayList.readObject(ArrayList.java:593) 
at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1846) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
at java.util.ArrayList.readObject(ArrayList.java:593) 
at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1846) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
at org.jboss.aop.joinpoint.InvocationResponse.readExternal(InvocationResponse.java:122) 
at java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1945) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1869) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObjectVersion2_2(JavaSerializationManager.java:239) 
at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:133) 
at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:120) 
at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.versionedRead(MicroSocketClientInvoker.java:943) 
at org.jboss.remoting.transport.socket.MicroSocketClientInvoker.transport(MicroSocketClientInvoker.java:584) 
at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122) 
at org.jboss.remoting.Client.invoke(Client.java:1550) 
at org.jboss.remoting.Client.invoke(Client.java:530) 
at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62) 
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61) 
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53) 
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72) 
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 
at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:103) 
at $Proxy5.synchronizeInvoice(Unknown Source) 
at com.celebi.ikarus.gl.bdo.GLBusinessDelegator.synchronizeInvoice(GLBusinessDelegator.java:116) 
at com.celebi.ikarus.gl.window.WInvoice.saveButtonPressed(WInvoice.java:303) 
at com.celebi.ikarus.main.component.toolbar.MainToolBar$5.actionPerformed(MainToolBar.java:129) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) 
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) 
at java.awt.Component.processMouseEvent(Component.java:6038) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260) 
at java.awt.Component.processEvent(Component.java:5803) 
at java.awt.Container.processEvent(Container.java:2058) 
at java.awt.Component.dispatchEventImpl(Component.java:4410) 
at java.awt.Container.dispatchEventImpl(Container.java:2116) 
at java.awt.Component.dispatchEvent(Component.java:4240) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) 
at java.awt.Container.dispatchEventImpl(Container.java:2102) 
at java.awt.Window.dispatchEventImpl(Window.java:2429) 
at java.awt.Component.dispatchEvent(Component.java:4240) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 

答えて

1

根本的な問題は、ServerResponseはORG /休止/タイプ/ AbstractComponentTypeを参照するデータで満たされていることですハイバネートクラスはスウィングクライアントのクラスパス上にありません。 hibernateクラスをクライアントのクラスパスに追加することもできますが、より重く、あなたが考えるよりも多くの参照を含むオブジェクトを返す可能性が高くなります。

そのクラスについての情報が不十分で、インベントリの詳細を知るためにインボイスが一般的にどのように作成されているかは例外ですが、これがコアの問題であることが示されています。

0

スタックトレースは、保存中にInvoiceインスタンスをサーバーに送信しようとすると、クライアントで "org.hibernate.type.AbstractComponentType"クラスが使用できないことを示します。

クラス定義に間違いがあるか、クライアントのクラスパスに休止状態のJARを追加する必要があります。

2

Hibernateで生成されたクラスをクライアントに直接シリアライズしないでください。これは、Hibernateの成果物が送信されるためです。これが原因でNoClassDefFoundエラーが発生します。

自分で作成した値オブジェクトを使用して、それらのオブジェクトにHibernateの結果を変換する必要があります。これは、Hibernateの特定のクラスへの隠れたリンクを取り除きます。

2

fetch = FetchType.LAZYで定義されたエンティティリレーションシップが1つ以上あります。 この関係の一部である関連エンティティは、AbstractComponentTypeに置き換えられています。

org.hibernate.type.AbstractComponentTypeクラスはJBossクライアントjarsに含まれていないため、JVMはClassNotFoundExceptionをスローしています。

この問題を解決するには、FetchTypeをEAGERに変更するか、クライアントに応答を送信する前にセッションBeanでリレーションシップが初期化されていることを確認します。

(このAbstractComponentTypeで置き換えられるエンティティにクライアントがアクセスしようとしない限り、AbstractComponentTypeクラスを含むjarをクラスパスに追加することもできます。この最後の代替方法はお勧めしません)。

関連する問題