Подтвердить что ты не робот

Компонент формы должен иметь UIForm в своей родословной. Предложение: заключить необходимые компоненты в <h: form>

Вот моя форма:

<form action="j_security_check">
    <h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5" frame="box" styleClass="center">
        <h:outputLabel value="User ID:"/>
        <h:inputText id="j_username" tabindex="1" />
        <h:outputLabel value="Password:"/>
        <h:inputSecret id="j_password"/>
        <h:outputLabel value=""/>
        <h:commandButton id="login" value="Login"/>
    </h:panelGrid>
</form>

Он отлично работает с Glassfish 3.0.1, но поскольку Glassfish 3.1 b2 показывает это предупреждение как FacesMessage на странице JSF:

Компонент формы должен иметь UIForm в своей родословной. Предложение: заключите необходимые компоненты в <h:form>

Если я изменил значение <form action="j_security_check"> на <h:form>, он не исправил его, я должен разместить <h:form> внутри <h:panelGrid>.

4b9b3361

Ответ 1

Это просто предупреждение, а не ошибка. Как правило, предупреждения предупреждают разработчика о непредвиденных ситуациях/условиях, которые могут не сразу вызвать технические ошибки/проблемы. Все может работать безупречно, но поведение/результаты могут быть не такими, как разработчик. Например, разработчик новичка случайно использовал <form> вместо <h:form>. Такие предупреждения тогда полезны.

В вашем конкретном случае вы просто вынуждены использовать <form> из-за необходимости отправки в службу, отличную от JSF. Вы, как более опытный разработчик, знаете, что это законно допустимо. Вы можете просто игнорировать это предупреждение. Это предупреждение появляется только тогда, когда javax.faces.PROJECT_STAGE установлено на Development в любом случае и не появляется, если оно установлено на Production.

Тем не менее, он все еще отображает предупреждение, когда другой компонент, такой как panelgrid между формой и его дочерними элементами, является ошибкой для меня. Я бы сообщил об этом ребятам Моджарры. Это похоже на то, что он проверяет только непосредственного родителя, а не всех родителей. Обновление: оно исправлено согласно Mojarra 2.1.3/2.2, см. также issue 2147.

Это, кстати, не специфический для Glassfish. Новая версия GF, конечно же, поставляется с более новой версией Mojarra, в которой реализованы эти предупреждения. См. Также issue 1663.

Похожие вопросы:

Ответ 2

Это было предложено мне Олегом с форума PrimeFaces и работает:

<h:form id="login" prependId="false"
                onsubmit="document.getElementById('login').action='j_security_check';">

С уважением, Брендан.

Ответ 3

Он отображается только в том случае, если вы работаете в JSF Development на основе вашей веб-конфигурации.

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

Когда вы меняете его на Production, он больше не будет отображаться

Ответ 4

Если кто-нибудь найдет этот полезный один день, у меня была такая же ошибка, и проблема заключалась в том, что у меня есть компонент-связки

<p:something ....

и этот компонент не был внутри элемента <h:form>

Ответ 5

Я использую Mojarra 2.1.27 и узнаю, что это мои ошибки. Однако его очень сложно найти, какие были ошибки. Надеюсь, кто-то из Мохарры мог добавить идентификатор компонента к предупреждающим сообщениям. Вот что я сделал, чтобы узнать компонент: (который также отправлен в https://code.google.com/p/primefaces/issues/detail?id=1586#c48)

Я отслеживаю его, загружая исходный код Mojarra и добавляя точку останова в класс com.sun.faces.context.FacesContextImpl в методе: public void addMessage (String clientId, сообщение FacesMessage). когда точка прерывания поймает, откройте окно "Отладка" или окно стека вызовов, чтобы узнать, что он был вызван классом com.sun.faces.application.view.FormOmittedChecker в методе private static void addFormOmittedMessage (контекст FacesContext) который ранее вызывается методом

public static void check (контекст FacesContext).

внутри метода проверки присутствует параметр переменной. Вы можете получить идентификатор компонента из окна Watch или переменной, а затем отследить его обратно на страницу html и код.

Это трудный путь, но надеюсь, что вы можете найти корень проблем. Это будет намного проще, если в предупреждающем сообщении также отображается проблемный идентификатор компонента

Ответ 6

В моем случае это предупреждающее сообщение отображалось в p:messages которое я поместил в диалог, чтобы показать ошибки проверки, поэтому я просто включил severity="error" в p:messages и предупреждение исчезло.