JSF ManagedProperty не работает для класса
Извините за мой английский. Я хочу установить @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 ответ
Является лучшим интерфейсом pratice wire вместо конкретного класса, чтобы предотвратить возникшую проблему.
Не удается преобразовать com.otv.model.bo.TaskBO@6c80b8 класса типа $Proxy135 в класс com.otv.model.bo.TaskBO
Часто управляемый объект Spring проксируется, и java-прокси может быть приведен ТОЛЬКО к интерфейсу, а не к конкретному классу; ошибка выше генерируется потому что:
- Объект TaskBO управляется Spring и проксируется к объекту типа $Proxy135 (реальный тип вашего объекта сейчас - не конкретный класс TaskBO, а прокси, который вы можете привести к ITaskBO, $Proxy135)
- вы пытаетесь сделать что-то подобное
public TaskBO taskBO = (TaskBO)$Proxy135;
но выставить прокси на конкретный класс невозможно - Правильный путь - написать
public ITaskBO taskBO = (ITaskBO)$Proxy135;
и это работает, потому что прокси может быть приведен только к интерфейсу
Избегайте - насколько это возможно - использование конкретного класса в пользу интерфейса.
Здесь вы можете посмотреть зависимость, если вы смешиваете конфигурацию, как описано в связанном вопросе.