2017-12-16 28 views
0

私はGlassFishの4.1.2で実行している私のアプリケーションを使用して、次のアクションを実行するアプリケーションのクライアントがあります。GlassFish 4.1.2アプリケーションでJPAエンティティを更新すると、アプリケーションクライアントがStreamCorruptedExceptionを報告するのはなぜですか?

  • は新しい人のJPAエンティティを作成します。
  • サーバー上でcreateメソッドを呼び出すと、新しい人物が渡されます。
    • 注:サーバーはpersonとperson2エンティティを作成します。
  • サーバーからperson2 JPAエンティティを取得します。
  • person2.notesリストプロパティにメモを追加します。
  • サーバー上で更新メソッドを呼び出し、更新されたエンティティを渡します。

サーバーはperson2エンティティを正しく更新し、エラーを報告しません。ただし、クライアントはupdateメソッドを実行するときに次のエラーを報告します。

javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
    org.omg.CORBA.MARSHAL: WARNING: 00810011: Exception from readValue on ValueHandler in CDRInputStream vmcid: OMG minor code: 11 completed: Maybe 
    at com.elliottlogic.elis.ejb.person._PersonManagerRemote_Wrapper.updatePerson2(com/elliottlogic/elis/ejb/person/_PersonManagerRemote_Wrapper.java) ~[classes/:na] 
    at com.elliottlogic.elis.access.Migrator.migratePeople(Migrator.java:216) ~[classes/:na] 
    at com.elliottlogic.elis.access.Main.main(Main.java:152) [classes/:na] 
Caused by: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is: 
    org.omg.CORBA.MARSHAL: WARNING: 00810011: Exception from readValue on ValueHandler in CDRInputStream vmcid: OMG minor code: 11 completed: Maybe 
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:266) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:211) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:150) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:226) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.elliottlogic.elis.ejb.person.__PersonManagerRemote_Remote_DynamicStub.updatePerson2(com/elliottlogic/elis/ejb/person/__PersonManagerRemote_Remote_DynamicStub.java) ~[classes/:na] 
    ... 3 common frames omitted 
Caused by: org.omg.CORBA.MARSHAL: WARNING: 00810011: Exception from readValue on ValueHandler in CDRInputStream 
    at com.sun.proxy.$Proxy19.valuehandlerReadException(Unknown Source) ~[na:na] 
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:900) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:995) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:518) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:383) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:482) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:201) ~[glassfish-corba-orb-4.0.1.jar:na] 
    ... 6 common frames omitted 
Caused by: java.io.StreamCorruptedException: WARNING: ORBIO00013: Stream corrupted 
    at com.sun.proxy.$Proxy70.streamCorrupted(Unknown Source) ~[na:na] 
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:2550) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectUsingFVD(IIOPInputStream.java:1676) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:405) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:307) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:273) ~[glassfish-corba-orb-4.0.1.jar:na] 
    at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readRMIIIOPValueType(CDRInputStream_1_0.java:893) ~[glassfish-corba-orb-4.0.1.jar:na] 
    ... 11 common frames omitted 

以下は、personおよびperson2エンティティを作成するアプリケーションクライアントコードです。

try { 

    person = elis.getPersonManager().createPerson(
      person, 
      ELISClientType.APPLICATION, 
      "0.0.0.0", 
      "Migrated Person. Originally Created: " + rs.getString("CREATED") + ", Original Creater: " 
        + convertEmployeeToELISUserName(rs.getString("CREATOR")) + "."); 

} catch (AuthorizationException e) { 

    logger.error("AuthorizationExcepton: ", e); 

} 

以下はPERSON2エンティティを更新アプリケーション・クライアント・コードです。

Person2 person2 = elis.getPersonManager().readPerson2ByID(person.getId()); 

List<Portrait2> portrait2s = new ArrayList<Portrait2>(); 
List<Email> emails = new ArrayList<Email>(); 
List<Telephone> telephones = new ArrayList<Telephone>(); 
List<Postal> postals = new ArrayList<Postal>(); 
List<Flex> flexes = new ArrayList<Flex>(); 
List<EntityEvent> history = new ArrayList<EntityEvent>(); 

person2.setPortrait2s(portrait2s); 
person2.setEmails(emails); 
person2.setTelephones(telephones); 
person2.setPostals(postals); 
person2.setFlexes(flexes); 
person2.setHistory(history); 

List<EntityNote> personNotes = new ArrayList<EntityNote>(); 

personNotes.add(note); 

person2.setNotes(personNotes); 

// The following method is throwing an EJBException for some reason that can be caught and 
// ignored. 
try { 

    person2 = elis.getPersonManager().updatePerson2(person2, ELISClientType.APPLICATION, 
      "0.0.0.0", "Added note."); 

} catch (EJBException e) { 

    logger.error("EJBExcepton: ", e); 

} 

次はPERSON2を更新し、サーバーコードです:

@RolesAllowed("Initializer") 
@Permission("Person2.update") 
@Override 
public Person2 updatePerson2(Person2 updatedPerson2, ELISClientType clientType, String ipAddress, String note) 
     throws AuthorizationException { 

    logger.trace("Started .updatePerson2({}, {}, {}, {}).", updatedPerson2, clientType, ipAddress, note); 

    Person2 managedPerson2 = em.find(Person2.class, updatedPerson2.getId()); 

    if (managedPerson2 == null) 
     throw new IllegalArgumentException("ID, " + updatedPerson2.getId() + ", is not associated with a Person2."); 

    // Add items to detached person that are managed by system. 
    updatedPerson2.setHistory(managedPerson2.getHistory()); 

    // Maintain Person and Portrait2s relationships. 
    updatedPerson2.setPerson(managedPerson2.getPerson()); 
    updatedPerson2.setPortrait2s(managedPerson2.getPortrait2s()); 

    ELISUser user = userManager.readELISUserByName(context.getCallerPrincipal().getName()); 

    OffsetDateTime currentDateTime = OffsetDateTime.now(); 

    // Due to bug in GlassFish (GLASSFISH-21184) where @Valid @ElementCollection do not work together, I 
    // have to manually validate person. 
    try { 

     Set<ConstraintViolation<Person2>> personCV = validator.validate(updatedPerson2); 

     if (personCV.size() > 0) 
      throw new ConstraintViolationException(personCV); 

    } catch (ConstraintViolationException e) { 

     logger.error("Caught ConstraintViolationException: {}", e.toString()); 

     logger.trace("Failed to complete .updatePerson()."); 

     throw e; 
    } 

    EntityEvent event = new EntityEvent(); 
    event.setType(EntityEventType.UPDATE); 
    event.setCreated(currentDateTime); 
    event.setCreater(user); 
    event.setClientType(clientType); 
    event.setIpAddress(ipAddress); 
    event.setChanges(Historian.compare(managedPerson2, updatedPerson2)); 

    if (note == null || note == "") 
     event.setNote("Updated person2."); 
    else 
     event.setNote(note); 

    EntityState entityState = new EntityState(); 
    entityState.setVersion(managedPerson2.getVersion()); 
    entityState.setXmlState(convertToCharArray(managedPerson2)); 

    event.setEntityState(entityState); 

    updatedPerson2.getHistory().add(event); 

    updatedPerson2 = em.merge(updatedPerson2); 

    ELISEvent elisEvent = new ELISEvent(); 
    elisEvent.setType(ELISEventType.ENTITY_UPDATE); 

    elisEvent.setEntityClass(updatedPerson2.getClass().getCanonicalName()); 
    elisEvent.setEntityId(updatedPerson2.getId()); 
    elisEvent.setEntityVersion(updatedPerson2.getVersion()); 
    elisEvent.setEntityName(updatedPerson2.getPerson().getName()); 

    eventManager.createELISEvent(elisEvent); 

    logger.trace("Finished .updatePerson2."); 

    return updatedPerson2; 

} 

私はupdatePerson2メソッドで戻りライン以外のすべてのコードをコメントアウトした場合、アプリケーションクライアントはそう、すべての問題を報告しませんupdatePerson2メソッドの何かがストリームを壊しています。

+0

私は、updatePerson2 EJBメソッドのupdatePerson2.getHistory()。add(event)行をコメントアウトすると、クライアントはエラーを報告しないことを発見しました。 –

答えて

0

この問題の根本的な原因は、EntityStateクラスがシリアライズ可能でないことでした。私はEntityStateクラス定義に "Serializableを実装する"を追加し、問題は消えました。

興味深いことに、更新をリクエストする前にクライアント側にダミーの履歴を追加する必要があると考えられたので、私はこのソリューションを見つけました。 EntityStateでイベントをクライアント側の履歴に追加し、サーバー上でupdatePerson2メソッドを呼び出したとき、クライアントは直ちにEntityStateがシリアル化可能でないことを報告しました。

関連する問題