[SPRING] 직렬화 관점에서 Spring 세션 범위 bean (컨트롤러)과 서비스에 대한 참조
SPRING직렬화 관점에서 Spring 세션 범위 bean (컨트롤러)과 서비스에 대한 참조
지금까지이 문제를 거의 무시했습니다. 최근에 내 모든 스프링 의존성을 일시적으로 선언하고 정적 유틸리티 클래스 인 WebApplicationContextUtils 및 ThreadLocal에서 요청 / ServletContext를 보유하는 readResolve ()로 다시 가져 오는 것을 고려했습니다. 이것은 지루하지만, 객체가 deserialize 될 때, 그것의 의존성은 현재의 애플리케이션 컨텍스트와 함께 "최신"이 될 것이라는 것을 보장한다.
이것 또는 스프링 컨텍스트의 부분을 serialize하기위한 지침에 대한 어떤 허용 된 연습 있습니까?
JSF에서 관리 Bean (~ 컨트롤러)은 상태 기반 (동작 기반 웹 프레임 워크와 달리)입니다. 그래서 내 질문은 spring-mvc보다 JSF가 더 중요하다.
해결법
-
==============================
1.이 프레젠테이션 (약 1시 14 분경)에서 연사는이 문제가 현재 직렬화가 불가능한 Bean의 프록시를 제공하여 봄 3.0에서 해결되었다고 말합니다.이 컨테이너는 현재 응용 프로그램 컨텍스트 (비 직렬화)
이 프레젠테이션 (약 1시 14 분경)에서 연사는이 문제가 현재 직렬화가 불가능한 Bean의 프록시를 제공하여 봄 3.0에서 해결되었다고 말합니다.이 컨테이너는 현재 응용 프로그램 컨텍스트 (비 직렬화)
-
==============================
2.나는 컨트롤러를 '싱글 톤'으로, 즉 세션이 아닌 애플리케이션마다 한 번씩 범위를 지정할 것으로 기대한다.
나는 컨트롤러를 '싱글 톤'으로, 즉 세션이 아닌 애플리케이션마다 한 번씩 범위를 지정할 것으로 기대한다.
세션 범위 지정은 일반적으로 사용자 별 정보 또는 사용자 별 기능을 저장하는 데 더 많이 사용됩니다.
일반적으로 세션에 'user'객체를 저장하고 인증 등에 사용되는 일부 bean 만 저장합니다. 그게 전부 야.
aop 프록시를 사용하여 세션 범위에서 일부 사용자 데이터를 구성하기위한 스프링 문서를 살펴보십시오.
http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection
희망은 도움이됩니다.
-
==============================
3.현상금은 단일 답변을 끌어 오지 않았으므로 제한적인 이해를 문서로 작성합니다.
현상금은 단일 답변을 끌어 오지 않았으므로 제한적인 이해를 문서로 작성합니다.
@Configuration public class SpringConfig { @Bean @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) MyService myService() { return new MyService(); } @Bean @Scope("request") public IndexBean indexBean() { return new IndexBean(); } @Bean @Scope("request") public DetailBean detailBean() { return new DetailBean(); } } public class IndexBean implements Serializable { @Inject MyService myService; public void doSomething() { myService.sayHello(); } } public class MyService { public void sayHello() { System.out.println("Hello World!"); } }
Spring은 노출 된 MyService를 IndexBean에 삽입하지 않고 직렬화 가능한 프록시를 삽입합니다. (나는 그것을 테스트했고, 효과가 있었다).
그러나 스프링 문서는 다음과 같이 썼다.
적어도 자바 기반의 설정을 사용할 때, Bean과 그 프록시는 아무런 예외도 발생시키지 않고 잘 인스턴스화 될 수있다. 그러나 직렬화 가능성을 달성하기 위해 범위가 지정된 프록시를 사용하는 것이 이러한 프록시의 의도 된 용도가 아닌 것 같습니다. 이와 같이 나는 Spring이 "버그"를 수정하고 Java 기반 구성을 통해 범위가 지정된 프록시를 만들지 못하게 할까 두려워합니다.
또한 제한이 있습니다. 프록시의 클래스 이름은 웹 응용 프로그램을 다시 시작한 후에 달라집니다 (프록시의 클래스 이름은 생성하는 데 사용 된 조언의 해시 코드를 기반으로하므로 hashCode의 인터셉터의 클래스 객체 .Class.hashCode는 Object.hashCode를 재정의하지 않으며, 다시 시작하면 안정적이지 않습니다. 따라서 직렬화 된 세션은 다른 VM이나 재시작시 사용할 수 없습니다.
-
==============================
4.나는 최근 JSF와 Spring을 결합했다. RichFaces와 JSF 빈을 직렬화하는 @KeepAlive 기능을 사용합니다. 이 방법을 사용하는 데는 두 가지 방법이 있습니다.
나는 최근 JSF와 Spring을 결합했다. RichFaces와 JSF 빈을 직렬화하는 @KeepAlive 기능을 사용합니다. 이 방법을 사용하는 데는 두 가지 방법이 있습니다.
1) JSF 백업 빈에 @Component ( "session") 사용
2) ELContext에서 다음과 같이 필요할 때마다 bean을 얻는다.
@SuppressWarnings("unchecked") public static <T> T getBean(String beanName) { return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, beanName); }
-
==============================
5.모든 다른 대안을 시도한 후에는 bean 정의에 aop : scoped-proxy를 추가하면된다.
모든 다른 대안을 시도한 후에는 bean 정의에 aop : scoped-proxy를 추가하면된다.
<bean id="securityService" class="xxx.customer.engagement.service.impl.SecurityContextServiceImpl"> <aop:scoped-proxy/> <property name="identityService" ref="identityService" /> </bean>
securityService가 뷰 범위 인 내 managedbean에 삽입됩니다. 이것은 잘 작동하는 것 같습니다. 스프링 문서에 따르면, securityService는 싱글 톤이기 때문에 BeanCreationException을 던질 것으로 예상됩니다. 그러나 이것은 일어나는 것 같지 않고 잘 동작합니다. 이것이 버그인지 또는 부작용이 될지 확실하지 않습니다.
-
==============================
6.Dynamic-Proxies의 직렬화는 다른 JVM 사이에서도 잘 작동합니다 (예 : 세션 복제에 사용됩니다.
Dynamic-Proxies의 직렬화는 다른 JVM 사이에서도 잘 작동합니다 (예 : 세션 복제에 사용됩니다.
@Configuration public class SpringConfig { @Bean @Scope(proxyMode = ScopedProxyMode.INTERFACES) MyService myService() { return new MyService(); } .....
컨텍스트를 새로 고치기 전에 ApplicationContext의 ID를 설정하기 만하면된다 (org.springframework.beans.factory.support.DefaultListableBeanFactory.setSerializationId (String) 참조).
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); // all other initialisation part ... // before! refresh ctx.setId("portal-lasg-appCtx-id"); // now refresh .. ctx.refresh(); ctx.start();
스프링 버전에서 잘 작동합니다. 버전 : 4.1.2.RELEASE
from https://stackoverflow.com/questions/3180963/spring-session-scoped-beans-controllers-and-references-to-services-in-terms-o by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 특정 URL에 대해 봄 보안을 사용 중지하는 방법 (0) | 2018.12.09 |
---|---|
[SPRING] http 요청 인터셉터를 추가하는 스프링 부트 (0) | 2018.12.09 |
[SPRING] @RequestParam에리스트 바인딩하기 (0) | 2018.12.09 |
[SPRING] YAML을 사용하여 Spring @PropertySource (0) | 2018.12.09 |
[SPRING] 봄 RestTemplate 시간 초과 (0) | 2018.12.09 |