2

对不起我的英语不好。我想@ManagedProperty为 class设置TaskBO,但它不起作用。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

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

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

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

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

为什么不@ManagedProperty与班级合作TaskBO

4

1 回答 1

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;,这很有效,因为代理只能转换为接口

避免 - 尽可能 - 使用有利于接口的具体类。

如果您正在混合链接问题中描述的配置,您可以在这里查看。

于 2013-08-18T21:57:54.670 回答