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如果你是混合配置如何描述鏈接的問題。