복붙노트

[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. ==============================

    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. ==============================

    2.이 클래스는 Serializable을 구현하지 않기 때문에이 예외가 발생합니다. Tomcat은 현재 실행중인 HttpSession 객체를 다시 시작 / 재배치 할 때마다 디스크에 모든 속성을 포함하여 직렬화하여주기 후에 다시 활성화합니다. 세션 범위가 지정된 객체는 HttpSession의 속성으로 저장되므로 재시작 / 재배포에서도 생존 할 수 있도록 Serializable을 구현해야합니다.

    이 클래스는 Serializable을 구현하지 않기 때문에이 예외가 발생합니다. Tomcat은 현재 실행중인 HttpSession 객체를 다시 시작 / 재배치 할 때마다 디스크에 모든 속성을 포함하여 직렬화하여주기 후에 다시 활성화합니다. 세션 범위가 지정된 객체는 HttpSession의 속성으로 저장되므로 재시작 / 재배포에서도 생존 할 수 있도록 Serializable을 구현해야합니다.

    Serializable을 만들고 싶다면 다음과 같이 구현하십시오.

    public class YourSpringService implements Serializable {}
    

    그렇지 않으면 예외를 무시하거나 Tomcat의 설정에서 디스크로의 세션 직렬화를 해제하십시오.

    동일한 이야기는 JSF 뷰 / 세션 범위 Bean에도 적용됩니다.

  3. ==============================

    3.글쎄, 마침내 나는 다음과 같이 잘 작동하게 만들 수 있었다.

    글쎄, 마침내 나는 다음과 같이 잘 작동하게 만들 수 있었다.

    1- 서비스 :

    @Service
    @Scope("singleton")
    public class PersonService{
    
    }
    

    2 - 봄 관리 빈 :

     @Component("person")
       @Scope("session")
       public class PersonBean implements Serializable{
    
       @Inject
       private PersonService personService;
    
       }
    

    귀하의 의견을 기다리고 있습니다.

  4. ==============================

    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;
        }
    
    }
    
  5. from https://stackoverflow.com/questions/7502891/getting-java-io-notserializableexception-with-a-spring-service-when-stopping-tom by cc-by-sa and MIT license