ошибка обнаружения циклического управления в JSF - PullRequest
3 голосов
/ 24 ноября 2010

Мне нужны страницы A и B, я хочу перейти от A к B и обратно от B к A в JSF.Я установил управляемое свойство B в управляемом компоненте A и наоборот, но проблема в том, что я получил ошибку, подобную ЦИКЛИЧЕСКОМУ ОБНАРУЖЕНИЮ БИНА.

  <managed-bean>
      <managed-bean-name>viewBulkMetalIssueBean</managed-bean-name>
      <managed-bean-class>com.cc.jas.web.manufacturing.bulkmetalissue.ViewBulkMetalIssueBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
      <managed-property>
       <property-name>viewJobcardBean</property-name>
       <property-class>com.cc.jas.web.manufacturing.jobcard.ViewJobcardBean</property-class>
       <value>#{viewJobcardBean}</value>
       </managed-property>


     </managed-bean>


    <managed-bean>
      <managed-bean-name>viewJobcardBean</managed-bean-name>
      <managed-bean-class>com.cc.jas.web.manufacturing.jobcard.ViewJobcardBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
       <property-name>viewBulkMetalIssueBean</property-name>
       <property-class>com.cc.jas.web.manufacturing.bulkmetalissue.ViewBulkMetalIssueBean</property-class>
       <value>#{viewBulkMetalIssueBean}</value>
       </managed-property>


      </managed-bean>

Есть ли какое-либо решение или альтернативное решение для этой проблемы?

Ответы [ 2 ]

13 голосов
/ 24 ноября 2010

Это действительно невозможно. Без этого обнаружения это привело бы только к бесконечному циклу установки управляемого свойства.

Чтобы обойти это, просто дайте bean-компоненту parent установить себя в bean-компоненте child, когда он был введен.

public class Parent {
    private Child child;

    public void setChild(Child child) {
        this.child = child;
        this.child.setParent(this);
    }

    // ...
}

С

<managed-bean>
    <managed-bean-name>parent</managed-bean-name>
    <managed-bean-class>com.example.Parent</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>child</property-name>
        <property-class>com.example.Child</property-class>
        <value>#{child}</value>
    </managed-property>
</managed-bean>

<managed-bean>
    <managed-bean-name>child</managed-bean-name>
    <managed-bean-class>com.example.Child</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
3 голосов
/ 24 ноября 2010

Вы не можете делать циклические инъекции в ваших управляемых бинах JSF. Это хорошо объясняется в MyFaces wiki .

Альтернативным решением является поиск ссылки из Java-кода в вашем управляемом компоненте с использованием распознавателя EL (для JSF 1.2):

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication()
    .getELResolver().getValue(elContext, null, "neededBean");

См. Вики-статью MyFaces для более подробного объяснения и реализации для других версий JSF.

...