2

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

@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 [email protected] 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

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

Cannot convert [email protected] of type class $Proxy135 to class com.otv.model.bo.TaskBO

通常Spring的管理对象是经过代理和Java代理可铸造ONLY接口,而不是混凝土类;上述错误产生的原因是:

  1. TaskBO对象由Spring管理和代理到类型的对象$ Proxy135(真正的类型的对象,现在是不是真的混凝土类TaskBO但你可以转换为代理ITaskBO,在$ Proxy135)
  2. 你正在尝试做一些像public TaskBO taskBO = (TaskBO)$Proxy135;但投的代理,具体的类是不可能
  3. 正确的方法是写public ITaskBO taskBO = (ITaskBO)$Proxy135;这个工程,因为代理只能转换为界面

尽量避免使用具体类来支持接口。

上瘾你可以看看here如果你是混合配置如何描述链接的问题。