【问题标题】:JSF ManagedProperty not working for classJSF ManagedProperty 不适用于课堂
【发布时间】:2013-08-18 21:22:03
【问题描述】:

对不起我的英语。我想为TaskBO 类设置@ManagedProperty,但它不起作用。 TaskMB类:

@ManagedBean(name="taskMB")
@RequestScoped
public class TaskMB implements Serializable {

    @ManagedProperty(value="#{TaskBO}")
    public TaskBO taskBO;

    public TaskBO getTaskBO() {
        return this.taskBO;
    }

    public void setTaskBO(TaskBO taskBO){
        this.taskBO = taskBO;
    }
    //...
}

它打印错误:

javax.servlet.ServletException: Unable to set property taskBO for managed bean taskMB
javax.el.ELException: java.lang.IllegalArgumentException: Cannot convert com.otv.model.bo.TaskBO@6c80b8 of type class $Proxy135 to class com.otv.model.bo.TaskBO

但如果我添加接口ITaskBO,它是有效的:

@ManagedProperty(value="#{TaskBO}")
public ITaskBO taskBO;

public ITaskBO getTaskBO() {
    return this.taskBO;
}

public void setTaskBO(ITaskBO taskBO){
    this.taskBO = taskBO;
}

为什么不将@ManagedPropertyTaskBO 类一起工作?

【问题讨论】:

    标签: spring jsf dependency-injection managed-bean managed-property


    【解决方案1】:

    是最好的实践线接口而不是具体的类来防止你遇到的问题。

    无法转换类型为 $Proxy135 的 com.otv.model.bo.TaskBO@6c80b8 到类 com.otv.model.bo.TaskBO

    Spring 的托管对象通常是代理的,Java 代理只能转换为接口而不是具体类;产生上述错误是因为:

    1. TaskBO 对象由 Spring 管理并代理到 $Proxy135 类型的对象(您的对象的真正类型现在不是真正的具体类 TaskBO,而是您可以强制转换为 ITaskBO 的代理,$Proxy135)
    2. 您正在尝试做一些类似public TaskBO taskBO = (TaskBO)$Proxy135; 的操作,但将代理转换为具体类是不可能的
    3. 正确的方法是写public ITaskBO taskBO = (ITaskBO)$Proxy135;,因为代理只能转换为接口

    避免 - 尽可能 - 使用具体类来支持接口。

    如果您正在混合配置如何在链接问题中描述,您可以查看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多