2013-03-22 32 views
5

Obecnie wykonuję pracę z rozporami2 i ten błąd pojawia się nagle. Niektóre pamięci podręczne moich obiektów nie działają.Nie można rozwiązać problemu wyjątku Struts2 NotSerializableException, nawet po aktualizacji do wersji 2.3.12

Używam JBoss 5 i Struts2: Struts2-core-2.3.4.1.jar xwork-core-2.3.4.1.jar

Ślad stosu jest tutaj: http://pastebin.com/QpPV01wX

to jakiś fragment :

java.io.NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
     at com.opensymphony.xwork2.inject.util.ReferenceMap.writeObject(ReferenceMap.java:595) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
     at java.util.HashMap.writeObject(HashMap.java:1001) 
     at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
     at java.util.HashMap.writeObject(HashMap.java:1001) 
     at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
     at org.jboss.ha.framework.server.SimpleCachableMarshalledValue.serialize(SimpleCachableMarshalledValue.java:271) 
     at 

Chciałbym sugestii lub może być coś złego zrobiłem.

Dziękuję bardzo z góry,

** AKTUALIZACJA

próbowałem usunąć tokenu sesji przechwytywania, że ​​użyłem w moim struts.xml i problemu nie ma. Mimo to nie wiem, dlaczego poszło nie tak, jeśli używam tokena. Przynajmniej w moim przypadku jest to rozwiązane przez usunięcie przechwytywacza sesji tokenu.

usunąć następujący wiersz na struts.xml

<interceptor-ref name="tokenSession"> 
    <param name="excludeMethods">list</param> 
    <param name="includeMethods">save,update</param> 
</interceptor-ref> 
+0

Czy migrowałeś do wersji 2.3.x ze starszej wersji? Już widziałem ten problem, ale nie jestem w stanie zidentyfikować źródła: \ Byłoby miło, gdybyś mógł opisać, jakiego rodzaju akcje/wyniki używasz (execAndWait), ponieważ wygląda to na problem z rozwartością2. –

+0

Tak, zrobiłem, migrowałem do najnowszej wersji 2.3.12 z innymi powiązanymi bibliotekami również. Dostępne akcje to aktualizowanie zasobu użytkownika. A problem podnosi się po tym. Ale użytkownik wciąż jest aktualizowany. Jakieś sugestie może? – daimagine

+0

@ LukaszLenart, tutaj, gdzie zakładam, że przyczyną problemu było. '11: 02: 02.076 ERROR [CommandAwareRpcDispatcher] java.io.NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl $ ConstructorInjector 11: 02:. 02.076 WARN [/ biuro] Nie udało się replikować sesji koY6yLeuKfHSBdQUfOJXBg __ node2' i com.opensymphony.xwork2.inject.ContainerImpl nie może być Serializowalny, jeśli się nie mylę. – daimagine

Odpowiedz

3

Wydaje się, że włożyłeś obiektów do pamięci podręcznej lub sesji, które nie wdrażają java.io.Serializable.

+0

Dzięki @vhunsicker. Zrobiłem kilka ponownych sprawdzeń, aby upewnić się, że cały mój obiekt sesji jest możliwy do serializacji. Czy możesz wspomnieć, gdzie mógłbym zaginąć? – daimagine

+0

Upewnij się, że obiekty sesji nie zawierają pól, których nie można serializować, takich jak odniesienie do kontenera. – rees

+0

Tak, dobrze. Serializables powinny zawierać jedynie prymitywne atrybuty lub atrybuty, które implementują same Serializable. W przypadku niektórych atrybutów nie można serializować, można je przekształcić w przejściowe. – vhunsicker

0

Spotykam też ten sam problem, ale ostatecznie odkryłem, że mój struts2-spring-plugin-2.0.14.jar nie pasuje do mojego struts2-core.2.2.3.jar, więc zastąpiłem struts2-spring- wtyczka z odpowiednią wersją i pracuje ~ powodzenia ~ nadzieję, że to pomocne dla innych ludzi ~

0

i rozwiązać ten problem poprzez przełączenie do tokenInterceptor zamiast tokenSessionInterceptor. tokenInterceptor jest w porządku w większości przypadków.

0

Zrobiłem ten problem również z kolumnami 2.3.32. Klasa com.opensymphony.xwork2.DefaultActionInvocation ma odniesienie do Akcji.
Jeśli działanie rozszerza się na com.opensymphony.xwork2.ActionSupport, wówczas odwołuje się do com.opensymphony.xwork2.inject.Container.
Obejście problemu polega na usunięciu zależności od ActionSupport.

+0

Z której wersji S2 korzystasz? –