【问题标题】:Wicket @SpringBean doesn't create serializable proxyWicket @SpringBean 不创建可序列化代理
【发布时间】:2010-12-28 08:49:53
【问题描述】:
@SpringBean
PDLocalizerLogic loc;

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

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

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

我做错了什么?

【问题讨论】:

  • +1 仅仅是因为这是我第一次听说 wrapInProxies 提到的地方,我设法追了下来(自己没有编写 Application 类),它解决了我所有的问题 :)

标签: java spring wicket


【解决方案1】:

你知道 bean 是如何被注入的吗?

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

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

【讨论】:

  • 嗯..我正在使用 InjectorHolder.getInjector().inject(this) 因为该类不是 wicket 组件,所以 bean 应该是可序列化的。
  • 那你确定是 loc 违反了不可序列化?这里还有其他原因吗?
  • 这是我的错误,我没有注意到我对 Mock 应用程序有不同的配置(wrapInProxies 设置为 false)。我已经改变了它,一切都按预期工作。打扰您了!
【解决方案2】:

首先,确保您的 bean 是真正的代理。默认情况下,spring 不会创建代理。

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

因此,如果需要,您还需要将班级设为 Serializable

【讨论】:

  • 在这种情况下,实际上应该由 Wicket 创建代理(它在后台使用 CGLib 来创建具体类,并使用常规 Java 代理来创建接口)。
【解决方案3】:

您能否再次检查实例化侦听器是否已添加到您的应用程序类中:

addComponentInstantiationListener(new SpringComponentInjector(this));

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

另见wicket @SpringBean can not create bean

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多