Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > WebSphere & serialization problem


Автор: MisterCleric 4.3.2009, 11:08
Привет всем.
Опишу ситуацию.
Есть два EAR: бизнес-слой и его клиент.
Клиент обращается к бизнесу через SessionFacade Remote interface соответсвенно 

Автор: ecologist 4.3.2009, 11:24
Ну тут же все достаточно очевидно - проблема в строке 18. Думаю, что именно там smile

Хотелось бы знать подробности все-таки.

Автор: MisterCleric 4.3.2009, 11:44
Не понял как так получилось с темой?...
продолжу тогда.
Клиент обращается к бизнесу через JNDI lookup SessionFacade Remote interface.
бизнес работает с базой через JPA на Hibernate.
Все отлично работает на JBOSS, но заказчик требует ставить проект на WebSphere.

Много было тут проблем с несовместимостью... Но самое, что меня убило это когда я вызвал метод с бизнеса, то возник довольно смешной exception типа
Цитата

 Caused by: org.omg.CORBA.MARSHAL: java.util.List is not Serializable and not Externalizable  vmcid: IBM  minor code: 8F2  completed: No
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectInternal(IIOPInputStream.java:429)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectLoop(IIOPInputStream.java:512)
    at com.ibm.rmi.io.IIOPInputStream.readObjectDelegate(IIOPInputStream.java:382)
    at com.ibm.rmi.io.IIOPInputStream.readObjectOverride(IIOPInputStream.java:638)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:356)
    at java.util.ArrayList.readObject(ArrayList.java:717)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:599)
    at com.ibm.rmi.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1700)
    at com.ibm.rmi.io.IIOPInputStream.inputObjectUsingClassDesc(IIOPInputStream.java:1435)
    at com.ibm.rmi.io.IIOPInputStream.inputObjectClassDesc(IIOPInputStream.java:1410)
    at com.ibm.rmi.io.IIOPInputStream.readSerializable(IIOPInputStream.java:1139)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectInternal(IIOPInputStream.java:427)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectLoop(IIOPInputStream.java:512)
    at com.ibm.rmi.io.IIOPInputStream.readObjectDelegate(IIOPInputStream.java:382)
    at com.ibm.rmi.io.IIOPInputStream.readObjectOverride(IIOPInputStream.java:638)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:356)
    at java.util.Hashtable.readObject(Hashtable.java:1005)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:599)
    at com.ibm.rmi.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1700)
    at com.ibm.rmi.io.IIOPInputStream.inputObjectUsingClassDesc(IIOPInputStream.java:1435)
    at com.ibm.rmi.io.IIOPInputStream.inputObjectClassDesc(IIOPInputStream.java:1410)
    at com.ibm.rmi.io.IIOPInputStream.readSerializable(IIOPInputStream.java:1139)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectInternal(IIOPInputStream.java:427)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectLoop(IIOPInputStream.java:512)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:464)
    at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:210)
    at com.ibm.rmi.iiop.CDRReader.read_value(CDRReader.java:1556)
    ... 131 more



Ну ладно, взяли переписали все возвраты методов бизнеса на ArrayList
Но есть такое:
Код

@Entity
@Table(name = "ROLES")
@org.hibernate.annotations.AccessType("field")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@SequenceGenerator(name = "SEQUENCE", sequenceName = "GEN_ROLES", allocationSize = 1)

public class Role implements Serializable {
    @Id
    @GeneratedValue(generator = "SEQUENCE")
    @Column(updatable = false, nullable = false, unique = true)
    private Long id;

    private String code;

    private String lastUpdateLogin;


    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "ROLERIGHTS",
            joinColumns = {@JoinColumn(name = "ROLEID")},
            inverseJoinColumns = {@JoinColumn(name = "RIGHTID")}
    )
    @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    @OptimisticLock(excluded = true)
    @Fetch(FetchMode.SELECT)
    private List<Right> rights = new ArrayList<Right>(); // сюда обратить внимание
}


соответсвенно здесь тоже Сфера ругнулась, что java.util.List is not Serializable and not Externalizable

Эт че получается, что перед тем, как сериализовать идет проверка на то что является ли тип поля (а не его значение) Serializable?

попытка обмана Hibernate такая: (пока не пробовал такое деплоить...)

Код

@Entity
@Table(name = "ROLES")
//@org.hibernate.annotations.AccessType("field")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@SequenceGenerator(name = "SEQUENCE", sequenceName = "GEN_ROLES", allocationSize = 1)

public class Role implements Serializable {

    private Long id;

    private String code;

    private String lastUpdateLogin;

    private ArrayList<Right> rights = new ArrayList<Right>(); // здесь!!!

    @Id
    @GeneratedValue(generator = "SEQUENCE")
    @Column(updatable = false, nullable = false, unique = true)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getLastUpdateLogin() {
        return lastUpdateLogin;
    }

    public void setLastUpdateLogin(String lastUpdateLogin) {
        this.lastUpdateLogin = lastUpdateLogin;
    }

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "ROLERIGHTS",
            joinColumns = {@JoinColumn(name = "ROLEID")},
            inverseJoinColumns = {@JoinColumn(name = "RIGHTID")}
    )
    @Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    @OptimisticLock(excluded = true)
    @Fetch(FetchMode.SELECT)
    public List<Right> getRights() {
        return rights;
    }

    public void setRights(List<Right> rights) {
        this.rights = new ArrayList<Right>(rights); // и здесь!!!
    }
}


но все-равно вопрос остается открытым. Что за проблема с ремоутингом на WebSphere при сериализации? И зачем это я должен под нее так вот извращенски подстраиваться(ну эт риторически)? Ну вот не хочется полторы сотни сущностей переписывать показанным выше образом
А может где-то надо какую-то галочку поставить или снять в консоле настройки сервака, что бы не было такой проверки на тип?

Автор: MisterCleric 4.3.2009, 17:51
Спешу сообщить, что обманка для persistence прокатила.
Но это ж изврат так писать!..

Автор: lowolf 1.3.2011, 06:37
Думаю стоит преподнять тему, никто не нашел адекватного решения? Потому как наткнулся на такую же проблему. Разрабатываю веб сервис который потом обращается к бизнесу через JNDI lookup SessionFacade Remote interface, бизнес так же работает с базой через JPA на Hibernate. Но после отправки запроса, возращается:
Код

Caused by: java.rmi.MarshalException: CORBA MARSHAL 0x4942f896 No; nested exception is: 
    org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : java.util.List is not Serializable and not Externalizable  vmcid: IBM  minor code: 896  completed: No
    at com.ibm.CORBA.iiop.UtilDelegateImpl.mapSystemException(UtilDelegateImpl.java:271)
    at javax.rmi.CORBA.Util.mapSystemException(Util.java:84)
    at com.ibm.rmi.util.ProxyUtil.copyObject(ProxyUtil.java:482)
    at com.ibm.rmi.util.ProxyUtil.invokeWithClassLoaders(ProxyUtil.java:754)
    at com.ibm.CORBA.iiop.ClientDelegate.invoke(ClientDelegate.java:1161)
    ... 39 more
Caused by: org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : java.util.List is not Serializable and not Externalizable  vmcid: IBM  minor code: 896  completed: No
    at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInputStream.java:1658)
    at com.ibm.rmi.util.ProxyUtil.copyObject(ProxyUtil.java:450)
    ... 41 more
Caused by: org.omg.CORBA.MARSHAL: java.util.List is not Serializable and not Externalizable  vmcid: IBM  minor code: 8F2  completed: No
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectInternal(IIOPInputStream.java:419)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObjectLoop(IIOPInputStream.java:500)
    at com.ibm.rmi.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:454)
    at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
    at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInputStream.java:1640)
    ... 42 more


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)