jsf1.2 rich: сообщения, дублирующие проверку rich: сообщение в той же форме - PullRequest
0 голосов
/ 08 февраля 2012

Я готовлю страницу регистрации с помощью приложения JSF / Spring webflow & mvc.Я добавил двухстороннюю проверку, одну на стороне клиента, у каждого поля ввода свои богатства: сообщение, а другую на стороне сервера, ответ бина регистрации в виде FaceStext.addMessage ().Моя проблема, когда я пытаюсь проверить валидацию, rich: компоненты сообщений показывают ошибки правильные, но rich: сообщения также показывают те же ошибки.Я хочу использовать сообщения только для определенных ошибок, что-то вроде почты уже существует в базе данных.

my rich: messages tag:

<rich:messages id="msg" layout="table" limitRender="true"
            style="font-weight:bold;color:#BDBDBD">
            <f:facet name="errorMarker">
                <h:graphicImage url="/images/messages_error.png" />
            </f:facet>
        </rich:messages>

<h:form ...>
   .....SOME LOGIC.....

<h:inputText id="i_ln" required="true" value="#{regBean.lastName}">
    <f:validateLength minimum="2" maximum="35" />
    <rich:ajaxValidator event="onblur" />
</h:inputText>
<rich:message for="i_ln">
    <f:facet name="errorMarker">
       <h:graphicImage url="/images/messages_error.png" />
    </f:facet>
</rich:message>
       .....
    </h:form>

Я проверил подобные проблемычто люди советуют использовать globalOnly = "true", и когда я использую этот атрибут, проверка дубликатов прекращается, но я не могу добавить ошибку серьезности.Мой oytput, как показано ниже:

Feb 07, 2012 10:08:04 PM com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=i_comment[severity=(ERROR 2), summary=(Eingabe wird benötigt.), detail=(Eingabe wird benötigt.)]
sourceId=i_title[severity=(ERROR 2), summary=(Eingabe wird benötigt.), detail=(Eingabe wird benötigt.)]
sourceId=i_salut[severity=(ERROR 2), summary=(Eingabe wird benötigt.), detail=(Eingabe wird benötigt.)]
sourceId=i_mobile[severity=(ERROR 2), summary=(Eingabe wird benötigt.), detail=(Eingabe wird benötigt.)]
sourceId=i_fax[severity=(ERROR 2), summary=(Eingabe wird benötigt.), detail=(Eingabe wird benötigt.)]

Еще один вопрос, я должен сохранить проверку на стороне сервера?

1 Ответ

1 голос
/ 08 февраля 2012

Хорошо, вот обходной путь: прежде всего, это известная проблема, относящаяся к jboss community :

Hi guys,

We investigated the issue further by debugging the RichFaces JavaScript code.

We noticed that both the <rich:messages globalOnly="true" /> component and the <rich:message for="inputField" /> component bind to an "onMessage" event.

When the event is triggered on tab, the "onMessage" function in "message.js.faces" is triggered for both components.

    As you can see in the attached screenshots the function is called twice: once for both components. Other <rich:message /> components which have a "for" attribute related to other fields are not triggered, just as expected.
    In the JavaScript code, we can see that a check is performed on the availability of the "forComponentId" attribute. If this attribute is available, a validation message is rendered for the specified component id. If this is not available, a global message is rendered.
    But when a global message is rendered, we cannot see any check on the globalOnly attribute. So any message is rendered, regardless of this attribute. The attribute is nowhere to be found in the JavaScript code.

    We were wondering if this is the bug or if there is an other piece of code that is responsible for checking whether only global error messages may be displayed?

Так что я поиграл с кодом и заметил, что rich: сообщения простовыбор сообщений, когда:

  1. if globalOnly = "true" и clientId равен нулю или clientId является идентификатором компонента сообщений.
  2. если for = "xxx" атрибут назначен, и сообщение имеет client & sourceID = "xxx"
  3. если нет для = "xxx" и нет globalOnly = "true" атрибут назначен, тогда любое сообщение также сообщения с нулевым идентификатором клиента.

Мне удалось применить два решения для этого:

Первое решение для страниц только с одним rich: messages;

Мой тег rich: messages просто имеет globalOnly = "true" , а нетдля атрибута ;

   <rich:messages id="msg" layout="list"
        style="font-weight:bold;color:#BDBDBD" 
        globalOnly="true">
        <f:facet name="errorMarker">
            <h:graphicImage url="/images/messages_error.png" />
        </f:facet>
    </rich:messages>

И мой bean-компонент отправляет сообщение с id = null;

private void addSeverityError(String message)
    {
        FacesContext context = FacesContext.getCurrentInstance();
        FacesMessage fMessage = new FacesMessage();
        fMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
        fMessage.setSummary(message);
        fMessage.setDetail("Validation error");
        context.addMessage(null, fMessage);
    }

Второе решение для страниц с несколькими форматами:мessages;

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

<rich:message id="nonExistClient" rendered="false"/>
<a4j:form id="messagesForm">
    <rich:messages id="msg" layout="list"
        style="font-weight:bold;color:#BDBDBD" 
        for="nonExistClient">
        <f:facet name="errorMarker">
            <h:graphicImage url="/images/messages_error.png" />
        </f:facet>
    </rich:messages>
</a4j:form>

И я добавил сообщение, как показано ниже, через FacesContext:

private void addSeverityError(String message)
{
    FacesContext context = FacesContext.getCurrentInstance();
    FacesMessage fMessage = new FacesMessage();
    fMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
    fMessage.setSummary(message);
    fMessage.setDetail("Validation error");
    context.addMessage("nonExistClient", fMessage);
}
...