2010-12-28 3 views
3
@SpringBean 
PDLocalizerLogic loc; 

위에서 사용하는 경우 java.io.NotSerializableException을 수신합니다. 왜냐하면 loc은 직렬화 가능하지 않기 때문입니다.하지만 스프링 빈은 직렬화 가능한 프록시이므로 문제가되지 않아야합니다. wicket-spring 라이브러리를 사용하고 있습니다. 인젝터 SpringComponentInjector로 wrapInProxies가 기본적으로 true로 설정되어 있으므로 프록시를 만들어야한다고 생각합니다. 그러나 그렇지 않습니다. 페이지 https://cwiki.apache.org/WICKET/spring.html#Spring-AnnotationbasedApproachWicket @SpringBean은 직렬화 가능 프록시를 생성하지 않습니다.

이 기록이 자동으로 처리 같이 주석 기반 접근 방식을 사용하여

, 당신은 이 주입 종속성에 대한 직렬화/역 직렬화를 걱정해야는 종속성 표시됩니다 에 의해 serializable 프록시

내가 뭘 잘못하고 있니?

+0

+1 나는 wrapInProxies가 언급 한 내용을 처음 들었 기 때문에 간단히 말하지만 (응용 프로그램 클래스를 직접 작성하지 않았 음) 모든 문제를 해결했습니다 :) –

답변

3

당신이 콩이 주입되는 방법을 알아 참조? 컴포넌트 초기화 스루

  1. (a 성분 및 SpringComponentInjector 의해 채워지 즉)
  2. InjectorHolder.getInjector를 사용하여 어떤 다른 목적은(). (이)를 주입?
  3. 은 개찰구 스프링 통합을 사용

사례 1과 2 (이 속성이 Spring 설정에 의해 설정되는 스프링 빈은 IE) 스프링에 의해 직접 주조 및 개찰 프록시로 bean을 포장 것이다 직렬화 가능합니다. 사례 3은 포장을하지 않고 봄이 전달하는 것만을 제공합니다.

+0

흠. 클래스가 wicket 구성 요소가 아니기 때문에 InjectorHolder.getInjector(). inject (this)를 사용하고 있으므로 bean을 직렬화 할 수 있어야합니다. – vinga

+0

그럼 당신은 그것이 직렬화되지 않는 것에 위반되는 loc입니까? 여기에 다른 원인이 있습니까? – Matt

+0

내 모토 였는데 모의 애플리케이션 (wrapInProxies가 false로 설정 됨)에 대한 설정이 다른 것을 알지 못했습니다. 나는 그것을 바꿨고 모든 것이 예상대로 작동한다. 널 귀찮게해서 미안해! – vinga

2

먼저 빈이 실제로 프록시되었는지 확인하십시오. 기본적으로 spring은 프록시를 생성하지 않습니다.

두 번째로 프록시 전략이 proxy-target-class="true"인지 여부를 확인하십시오. false 인 경우 (afaik) 객체에 대한 참조가 JDK 프록시의 호출 핸들러에 저장되고 직렬화되도록 시도됩니다.

필요한 경우 수업을 Serializable으로 만들어야합니다.

+0

이 경우 실제로 Wicket은 프록시를 만들어야합니다 (구체적인 클래스의 경우 CGLib를 사용하고 인터페이스의 경우 Java 프록시를 사용합니다). – Eelco

1

할 수 있습니다 인스턴스화 리스너 응용 프로그램 클래스에 추가되었는지 다시 확인 :

addComponentInstantiationListener (새 SpringComponentInjector (이));

또한 Wicket 구성 요소의 필드에만 적용되며 임의의 클래스는 사용할 수 없습니다.

wicket @SpringBean can not create bean

관련 문제