抱歉我的英文。我想为课程@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
无关?
答案 0 :(得分:1)
最好用pratice wire接口代替具体类来防止遇到的问题。
无法转换类型为$ Proxy135的com.otv.model.bo.TaskBO@6c80b8 上课com.otv.model.bo.TaskBO
通常Spring的托管对象被代理,并且java代理只能被转换为接口而不是具体类;产生上述错误的原因是:
public TaskBO taskBO = (TaskBO)$Proxy135;
但是将代理转换为具体类是不可能的public ITaskBO taskBO = (ITaskBO)$Proxy135;
,这是有效的,因为代理只能转换为接口尽可能避免使用具体类来支持接口。
在成瘾中,如果要混合配置链接问题中描述的配置,您可以查看here。