JSF ManagedProperty不适用于类

时间:2013-08-18 21:22:03

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

抱歉我的英文。我想为课程@ManagedProperty设置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

但是如果我添加接口ITaskBO,它就可以了:

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

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

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

为什么@ManagedProperty与班级TaskBO无关?

1 个答案:

答案 0 :(得分:1)

最好用pratice wire接口代替具体类来防止遇到的问题。

  

无法转换类型为$ 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;,这是有效的,因为代理只能转换为接口
  4. 尽可能避免使用具体类来支持接口。

    在成瘾中,如果要混合配置链接问题中描述的配置,您可以查看here