2010-11-03 3 views
4

У меня возникла проблема, когда управляемый bean-файл @ViewScoped ведет себя как управляемый элемент @RequestScoped просто потому, что я использую тег составной: insertChildren. другие сообщения по этому вопросу, и я знаю об ограничениях @ViewScoped managedBeans, но у меня нет явных привязок, и я не использую JSTL в своем составном компоненте.JSF 2 Компонентный компонент insertChildren tag @ViewScoped в @RequestScoped :(

Я предполагаю, что тег insertChildren привязан к the managedBean, но я надеюсь, что кто-то там может вывести меня из моего несчастья и показать мне обходной путь - я действительно не хочу начинать использовать фасоль @SessionScoped. :)

Вот мой упрощенный пример. Простой управляемый Bean:

@ManagedBean(name = "simpleMB") 
@ViewScoped 
public class SimpleManagedBean implements Serializable { 

    private static final long serialVersionUID = -1; 

    @NotNull 
    @Email 
    private String email; 

    public SimpleManagedBean() { 
     System.out.println("SimpleManagedBean"); 
    } 

    @PostConstruct 
    public void postConstruct() { 
     System.out.println("Post construct"); 
    } 

    public String submit() { 
     return null; 
    } 

    ... setter and getter 
} 

Используя SimpleManagedBean выше с формой и составным компонентом (без insertChildren) ниже, все работает, как ожидалось. Я ввожу какой-то текст, нажимаю «Отправить» и отображается ошибка вместе с введенным текстом. На этом этапе я счастлив.

<h:form> 
    <foo:simpleNoChildren /> 

    <h:commandButton id="submit" 
        value="Submit" 
        action="#{simpleMB.submit}" /> 
</h:form> 

... and the composite component .... 

<composite:interface /> 
<composite:implementation> 

<h:panelGrid columns="3"> 
    <h:outputText value="Email" /> 

    <h:inputText id="email" 
       value="#{simpleMB.email}" 
       required="true" /> 

    <h:message for="email" /> 
</h:panelGrid> 

</composite:implementation> 

Теперь, если я двигаю panelGrid и это компоненты из составного компонента и заменить с композитным: insertChildren тег, как показано ниже, когда я вхожу какой-нибудь текст и нажмите представить соответствующее сообщение об ошибке отображается , но поскольку метод @PostConstruct вызывается снова, текст, который я ввел, больше не отображается. :(

<h:form> 
    <foo:simple> 

    <h:panelGrid columns="3"> 
    <h:outputText value="Email" />   
    <h:inputText id="email" value="#{simpleMB.email}" required="true" /> 
     <h:message for="email" /> 
    </h:panelGrid> 

    </foo:simple>  

    <h:commandButton id="submit" value="Submit" action="#{simpleMB.submit}" /> 
</h:form> 

... and my complicated composite component :) ... 

<composite:interface /> 
<composite:implementation> 
    <composite:insertChildren /> 
</composite:implementation> 

Любые мысли или предложения

Заранее спасибо

ответ

2

Для других людей с той же проблемой:?.

Это известная ошибка в JSF -> подробнее см http://java.net/jira/browse/JAVASERVERFACES-2040

Возможным обходным путем является добавление грани к композитному интерфейсу и рендеринг грани с помощью cc: renderFacet вместо cc: insertChildr эн.

Смежные вопросы