Wicket @SpringBean不会创建可序列化代理

@SpringBean PDLocalizerLogic loc; 

在上面使用时,我收到java.io.NotSerializableException。 这是因为loc不可序列化,但这不应该是问题,因为spring bean是可序列化的代理。 我正在使用wicket-spring库,并且作为注入器SpringComponentInjector,其中wrapInProxies默认设置为true,所以我认为应该创建代理,但它们不是。

在页面https://cwiki.apache.org/WICKET/spring.html#Spring-AnnotationbasedApproach写道:

使用基于注释的方法,您不必担心注入的依赖项的序列化/反序列化,因为这是自动处理的,依赖项由可序列化的代理表示

我究竟做错了什么?

你知道豆子是怎么注射的吗?

  1. 通过组件初始化(即组件并由SpringComponentInjector填充)
  2. 一些其他对象使用InjectorHolder.getInjector()。inject(this)?
  3. 由弹簧直接注入(即这是一个Spring bean,其中属性由Spring配置设置)

案例1和案例2将使用wicket-spring集成,并使用可序列化的wicket代理包装bean。 案例3只会为您提供无需包装的弹簧传递给您。

首先,确保你的bean真的被代理了。 默认情况下,spring不会创建代理。

其次,检查您的代理策略 – 是否是proxy-target-class="true" 。 如果为false ,则(afaik)对对象的引用存储在JDK代理的调用处理程序中,并尝试序列化。

因此,如果您需要,您还需要使您的类Serializable

您能否仔细检查是否在应用程序类中添加了实例化侦听器:

addComponentInstantiationListener(new SpringComponentInjector(this));

此外,这仅适用于Wicket组件中的字段,而不适用于任意类。

另见wicket @SpringBean无法创建bean