[SPRING] 바람둥이 중지시 스프링 서비스로 java.io.NotSerializableException 받기
SPRING바람둥이 중지시 스프링 서비스로 java.io.NotSerializableException 받기
JSF 2와 함께 스프링 3을 사용하고 있습니다. JSF 관리 빈을 스프링 빈으로 대체했습니다. 빈 위에 추가했습니다.
@Component("mybean")
@Scope("session")
내 콩에서 나는 봄 서비스 (annotation @service로 선언 된)를 autowiring하고있다.
잘, 모든 서비스와 함께 잘 작동하지만, 내가 바람둥이 6을 막으려 고했을 때, 나는 나의 봄 서비스로이 예외를 얻고있다.
java.io.NotSerializableException
어떤 이유에서이 예외가 생겨나 고 그것을 해결하는 방법.
최신 정보:
내 서비스가 serializable을 구현 한 후 가끔 예외가 발생하는 경우가 있습니다.
java.lang.IllegalStateException: Cannot deserialize BeanFactory with id org.springframework.web.context.WebApplicationContext:/spring_faces: no factory registered for this id
at org.springframework.beans.factory.support.DefaultListableBeanFactory$SerializedBeanFactoryReference.readResolve(DefaultListableBeanFactory.java:972)
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.invokeReadResolve(ObjectStreamClass.java:1061)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1762)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480)
at org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor.readObject(AbstractBeanFactoryPointcutAdvisor.java:98)
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.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480)
at org.springframework.aop.framework.AdvisedSupport.readObject(AdvisedSupport.java:550)
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.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
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.apache.catalina.session.StandardSession.readObject(StandardSession.java:1496)
at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:998)
at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:394)
at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)
at org.apache.catalina.session.StandardManager.start(StandardManager.java:648)
at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:446)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4631)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.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 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
조언 해주십시오.
해결법
-
==============================
1.오류를 살펴보면, 바람둥이가 전체 봄 컨텍스트를 직렬화하려고하는 것 같아서, 당신이 서비스에서 Serializable을 구현하고 있기 때문일 수 있다고 생각합니다. 나는 당신이 이것을 할 필요가 있을지도 모른다고 생각했다. JSF를 잘 모르지만 스코프 된 콩에 대한 나의 이해는 나를 생각하게한다. 당신은 이것과 같은 것이 필요할지도 모른다.
오류를 살펴보면, 바람둥이가 전체 봄 컨텍스트를 직렬화하려고하는 것 같아서, 당신이 서비스에서 Serializable을 구현하고 있기 때문일 수 있다고 생각합니다. 나는 당신이 이것을 할 필요가 있을지도 모른다고 생각했다. JSF를 잘 모르지만 스코프 된 콩에 대한 나의 이해는 나를 생각하게한다. 당신은 이것과 같은 것이 필요할지도 모른다.
@Component @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="session") public class MyBean implements Serializable { //no need to implement serializable on service @Autowired(required=true) private MyService service; }
-
==============================
2.이 클래스는 Serializable을 구현하지 않기 때문에이 예외가 발생합니다. Tomcat은 현재 실행중인 HttpSession 객체를 다시 시작 / 재배치 할 때마다 디스크에 모든 속성을 포함하여 직렬화하여주기 후에 다시 활성화합니다. 세션 범위가 지정된 객체는 HttpSession의 속성으로 저장되므로 재시작 / 재배포에서도 생존 할 수 있도록 Serializable을 구현해야합니다.
이 클래스는 Serializable을 구현하지 않기 때문에이 예외가 발생합니다. Tomcat은 현재 실행중인 HttpSession 객체를 다시 시작 / 재배치 할 때마다 디스크에 모든 속성을 포함하여 직렬화하여주기 후에 다시 활성화합니다. 세션 범위가 지정된 객체는 HttpSession의 속성으로 저장되므로 재시작 / 재배포에서도 생존 할 수 있도록 Serializable을 구현해야합니다.
Serializable을 만들고 싶다면 다음과 같이 구현하십시오.
public class YourSpringService implements Serializable {}
그렇지 않으면 예외를 무시하거나 Tomcat의 설정에서 디스크로의 세션 직렬화를 해제하십시오.
동일한 이야기는 JSF 뷰 / 세션 범위 Bean에도 적용됩니다.
-
==============================
3.글쎄, 마침내 나는 다음과 같이 잘 작동하게 만들 수 있었다.
글쎄, 마침내 나는 다음과 같이 잘 작동하게 만들 수 있었다.
1- 서비스 :
@Service @Scope("singleton") public class PersonService{ }
2 - 봄 관리 빈 :
@Component("person") @Scope("session") public class PersonBean implements Serializable{ @Inject private PersonService personService; }
귀하의 의견을 기다리고 있습니다.
-
==============================
4.readObject () + 정적 ApplicationContext 해킹을 사용하여 문제를 해결해야했습니다.
readObject () + 정적 ApplicationContext 해킹을 사용하여 문제를 해결해야했습니다.
@Component @Scope(value = SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class FlashMessages implements Serializable { @Autowired transient private SomeBean someBean; private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { ois.defaultReadObject(); // restore someBean field on deserialization SpringUtils.getContext().getAutowireCapableBeanFactory().autowireBean(this); } } @Component public class SpringUtils implements ApplicationContextAware { static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtils.applicationContext = applicationContext; } public static ApplicationContext getContext() { return applicationContext; } }
from https://stackoverflow.com/questions/7502891/getting-java-io-notserializableexception-with-a-spring-service-when-stopping-tom by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JNDI로 스프링 부트에서 다중 데이터 소스 설정하기 (0) | 2019.04.21 |
---|---|
[SPRING] HTTP 상태 500 - 서블릿 Dispatcher에 대한 Servlet.init ()가 예외를 발생했습니다. (0) | 2019.04.21 |
[SPRING] 스프링 보안 설정 @ 유일 예외가 아니다. (0) | 2019.04.21 |
[SPRING] 스프링 MVC 3의 안정된 경로 매개 변수 (0) | 2019.04.21 |
[SPRING] AOP를 사용하여 File, FileReader, FileWriter, FileInputStream 및 FileOutputStream의 생성자를 차단할 수 있습니까? (0) | 2019.04.21 |