Powiązanie atrybutu powoduje, że duplikat ID komponentu znajduje się w widoku

Oto kod JSF:

<h:inputText binding="#{bean.input}" />

A oto część backing bean do oparcia wiązania:

private HtmlInputText input;

public void setInput(HtmlInputText input) {
    this.input = input;
}

public HtmlInputText getInput() {
    return this.input;
}

Kiedy otwieram stronę za pierwszym razem wszystko działa dobrze, ale kiedy otwieram ją za drugim razem (Odśwież lub otwórz ten sam adres url w innej karcie lub w inny sposób) dostaję duplikat ID error. Komunikat o błędzie mówi, że <h:inputText> nie ma unikalnego identyfikatora. Oto część długiego Komunikatu o błędzie:

java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view
    +id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe

Problem wystąpił po dodaniu atrybutu binding. Jeśli go usunę, wszystko będzie dobrze działać. jeszcze raz. Jak prawidłowo używać atrybutu binding?

Author: BalusC, 2010-01-20

2 answers

Błędy duplikatu ID komponentu mogą wystąpić, gdy:

  • ten sam IDENTYFIKATOR jest używany na różnych komponentach wewnątrz tego samego NamingContainer.
  • fizycznie różne składniki są związane z tą samą właściwością tej samej fasoli.
  • {[1] } jest zadeklarowana na stronie include zamiast na stronie nadrzędnej.
  • ta sama strona dołączana jest wielokrotnie wewnątrz tej samej NamingContainer.
  • komponent jest tworzony dynamicznie bez jawnego ID przydzielony.

Tutaj, NamingContainer jest m.in. <h:form>, <h:dataTable> i <f:subview>.

Podczas używania binding, należy powiązać go z właściwością, która jest używana wyłącznie przez dany komponent na zasadzie każdego żądania. Twój konkretny przypadek wskazuje, że powiązanie to jest współdzielone przez wiele komponentów, być może w różnych żądaniach. Gdy powiązasz komponent z właściwością fasoli podkładowej, fasola podkładowa absolutnie nie powinna być w szerszym zakresie niż zakres żądania. Zobacz też JSF 2.0 rozdział 3.1.5 (podkreślenie):

3.1.5 Wiązania Komponentów

...

Powiązania komponentów są często używane w połączeniu z JavaBeans, które są dynamicznie tworzone za pomocą narzędzia Managed Bean Creation facility (patrz sekcja 5.8.1 "VariableResolver and the Default VariableResolver"). zdecydowanie zaleca się, aby twórcy aplikacji umieszczali zarządzane fasole, które są wskazywane przez wyrażenia wiążące komponenty w zakresie "request". dzieje się tak, ponieważ umieszczenie go w zakresie sesji lub aplikacji wymagałoby bezpieczeństwa wątku, ponieważ instancje UIComponent zależą od działania wewnątrz pojedynczego wątku. Istnieje również potencjalnie negatywny wpływ na zarządzanie pamięcią podczas umieszczania powiązania komponentu w zakresie "sesji".

Zobacz też:

 32
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:22

Miałem ten sam problem, dopóki nie znalazłem tego znacznika, który evit duplicate component id

<f:subview id="top">
                <p:outputPanel id="panelHeader1"  
                    binding="#{circularRequestBean.panelHeader}" autoUpdate="true"
                    class="col-md-12 col-sm-12 col-xs-12 col-lg-12 wihtoutPadding"
                    style="padding:0px; !important; display:block;" />

            </f:subview>
 1
Author: Marcos Lopez Uchiha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 17:32:15