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-прокси может быть приведен ТОЛЬКО к интерфейсу, а не к конкретному классу; ошибка выше генерируется потому что:

  1. Объект TaskBO управляется Spring и проксируется к объекту типа $Proxy135 (реальный тип вашего объекта сейчас - не конкретный класс TaskBO, а прокси, который вы можете привести к ITaskBO, $Proxy135)
  2. вы пытаетесь сделать что-то подобное public TaskBO taskBO = (TaskBO)$Proxy135; но выставить прокси на конкретный класс невозможно
  3. Правильный путь - написать public ITaskBO taskBO = (ITaskBO)$Proxy135; и это работает, потому что прокси может быть приведен только к интерфейсу

Избегайте - насколько это возможно - использование конкретного класса в пользу интерфейса.

Здесь вы можете посмотреть зависимость, если вы смешиваете конфигурацию, как описано в связанном вопросе.

Другие вопросы по тегам