Не понял как так получилось с темой?... продолжу тогда. Клиент обращается к бизнесу через 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 при сериализации? И зачем это я должен под нее так вот извращенски подстраиваться(ну эт риторически)? Ну вот не хочется полторы сотни сущностей переписывать показанным выше образом А может где-то надо какую-то галочку поставить или снять в консоле настройки сервака, что бы не было такой проверки на тип? |