2012-11-21 4 views
3

최근에 Ajax 유틸리티를 사용하기 위해 OmniFaces 라이브러리를 프로젝트에 가져 왔지만이를 수행 한 후 PrimeFaces 편집 가능한 데이터 테이블은 이제 유효성 검사 오류를 무시합니다.PrimeFaces 사용자 정의 유효성 검사기 및 전각으로 편집 가능한 데이터 테이블

나는 현재 AP가 : 사용자 정의 유효성 검사기와 데이터 테이블 및과 같이 필터링 :

<p:dataTable var="ticket" value="#{myBean.tickets}" 
    id="ticketTable" widgetVar="ticketTable" editable="true" 
    rowKey="#{ticket.idTicket}" 
    filteredValue="#{myBean.filteredTickets}" 
    paginator="true" rows="20" 
    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
    rowsPerPageTemplate="#{myBean.rowsPerPageTemplate}"> 

    <p:ajax event="rowEdit" listener="#{myBean.onEdit}" 
     /> 
    <p:ajax event="rowEditCancel" 
     listener="#{myBean.onCancel}" /> 


    <p:column headerText="Title" sortBy="#{ticket.title}" 
     filterBy="#{ticket.title}"> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{ticket.title}" /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText value="#{ticket.title}" /> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 

    <p:column sortBy="#{ticket.start}"> 
     <f:facet name="header"> 
      <h:panelGrid columns="1"> 
       <h:outputText value="Start" /> 
       <h:panelGrid columns="3"> 
        <h:outputLabel value="From:" for="filterTripDateFrom" /> 
        <p:calendar id="filterTripDateFrom" 
         value="#{myBean.filterStart}" navigator="true" 
         effect="fadeIn" pattern="MM/dd/yy" size="8"> 
         <p:ajax event="dateSelect" 
          listener="#{myBean.filterDates()}" 
          update="ticketTable" /> 
        </p:calendar> 
        <p:commandButton value="Clear" 
         action="#{myBean.clearStart()}" 
         update="filterTripDateFrom, ticketTable" /> 
       </h:panelGrid> 
      </h:panelGrid> 
     </f:facet> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{ticket.start}"> 
        <f:convertDateTime pattern="EE, MMM dd, yyyy: HH:mm z" /> 
       </h:outputText> 
      </f:facet> 
      <f:facet name="input"> 
       <p:calendar value="#{ticket.start}" pattern="MM/dd/yy HH:mm" 
        stepMinute="15"> 
        <f:validator validatorId="dateValidator" /> 
        <f:attribute name="endDate" 
         value="#{editEndDate}" /> 
       </p:calendar> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 

    <p:column sortBy="#{ticket.end}"> 
     <f:facet name="header"> 
      <h:panelGrid columns="1"> 
       <h:outputText value="End" /> 
       <h:panelGrid columns="3"> 
        <h:outputLabel value="To:" for="filterTripDateTo" /> 
        <p:calendar id="filterTripDateTo" 
         value="#{myBean.filterEnd}" navigator="true" 
         effect="fadeIn" pattern="MM/dd/yyyy" size="8"> 
         <p:ajax event="dateSelect" 
          listener="#{myBean.filterDates()}" 
          update="ticketTable" /> 
        </p:calendar> 
        <p:commandButton value="Clear" 
         action="#{myBean.clearEnd()}" 
         update="filterTripDateTo, ticketTable" /> 
       </h:panelGrid> 
      </h:panelGrid> 
     </f:facet> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{ticket.end}"> 
        <f:convertDateTime pattern="EE, MMM dd, yyyy: HH:mm z" /> 
       </h:outputText> 
      </f:facet> 
      <f:facet name="input"> 
       <p:calendar value="#{ticket.end}" pattern="MM/dd/yyyy HH:mm" 
        stepMinute="15" binding="#{editEndDate}" /> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
    <p:column headerText="Options" style="width:50px"> 
     <p:rowEditor /> 
    </p:column> 


</p:dataTable> 

OmniFaces을 추가하기 전에 동작였습니다 내 사용자 지정 날짜 유효성 검사기 (아래 제공)는에 ValidatorException 행을 던졌다 경우 편집중인 테이블은 열린 상태로 유지되며 페이지는 예외에서 FacesMessage을 표시합니다. OmniFaces 라이브러리를 추가 한 후 FacesMessage이 계속 표시되지만 예외가 발생하지 않는 것처럼 테이블의 행이 닫힙니다. OmniFaces 1.2 & 1.3 SNAPSHOT을 사용해 보았습니다. 둘 다 동일한 동작을합니다.
어쨌든 원래 기능을 되 찾을 수 있습니까, 아니면 내 프로젝트에서 OmniFaces를 제거해야합니까?

도움 주셔서 감사합니다.

addl info : Tomcat 7.0; MyFaces 2.1; PrimeFaces 3.4.1; OmniFaces 1.3 스냅 20121027

내 사용자 정의 날짜 검사기 :

public void validate(FacesContext context, UIComponent component, 
     Object value) throws ValidatorException 
{ 
    // get the submitted value for the start date 
    DateValidator.logger.debug("starting validation"); 
    Date startDate = (Date) value; 

    // get the bound component that contains the end date 
    DateValidator.logger.debug("getting UI component"); 
    UIInput endDateComponent = (UIInput) component.getAttributes().get(
      "endDate"); 

    // get the value of the bound component 
    DateValidator.logger.debug("getting second date"); 
    String endDateString = (String) endDateComponent.getSubmittedValue(); 

    // and parse it into a date 
    DateValidator.logger.debug("converting date"); 
    Date endDate = JodaUtils 
      .stringToUtil(endDateString, "MM/dd/yyyy HH:mm"); 


    // if either of the submitted values were empty, let the required tag 
    // take care of it 
    if (startDate == null || endDate == null) 
    { 
     DateValidator.logger.debug("a date was null; start: " + startDate 
       + "; end: " 
       + endDate); 
     return; 
    } 

    // otherwise if the start time is the same as, or before the end time 
    else if (startDate.getTime() >= endDate.getTime()) 
    { 
     DateValidator.logger 
       .debug("end date was the same as or before start date; start: " 
         + startDate + "; end: " + endDate); 

     // set the bound component as invalid 
     endDateComponent.setValid(false); 

     // update the container containing the components to show that the 
     // fields were invalid 
     Ajax.update(endDateComponent.getParent().getClientId()); 

     // and send a notification to the front end 
     throw new ValidatorException(new FacesMessage(
       FacesMessage.SEVERITY_ERROR, 
       "The end time must be after the start time.", 
       "The end time must be after the start time.")); 
    } 
    else 
    { 
     DateValidator.logger.debug("all clear; start: " + startDate 
       + "; end: " 
       + endDate); 
    } 
    Ajax.update(":form:ticketTable"); 
} 

답변

2

내가 당신의 문제를 재현 할 수 있었다. 이는 기본적으로 MyFaces와 OmniPartialResponseWriter의 조합으로 인해 발생합니다. MyFaces의 표준 PartialResponseWriter은 모든 메서드를 getWrapped() 메서드에 위임하지 않고 직접 로컬 변수 wrapped에 위임합니다. Mojarra에서는 모든 메서드가 getWrapped()으로 위임되므로이 메서드는 구성 요소 라이브러리 PartialResponseWriter 구현에서 재정의 될 수 있습니다. 대신 로컬 wrapped 인스턴스가 단지에서 MyFaces 소유 OmniPartialResponseWriter의 경우이다 (참조되고있다,

코드는 인 Mojarra에서 잘 작동하지만에서 MyFaces에 PartialResponseWriter#getWrapped() 방법합니다 (OmniFaces이 하나가 PrimeFaces 하나를 반환) 호출되지 않습니다 하나는 PrimeFaces가 아닌 하나), PrimeFaces의 PrimePartialResponseWriter을 완전히 건너 뜁니다. 따라서 JSF 유효성 검사가 실패한 PrimeFaces ajax 엔진에 대한 정보가 포함 된 XML 응답에 다음 확장명을 추가 할 수 없습니다.

<extension ln="primefaces" type="args">{"validationFailed":true}</extension> 

이것은 다소 불행한 문제입니다. 이 문제는 OmniFaces 1.3에서 수정되었습니다. 솔루션을 구현할 필요가없는 경우에도 해결책은 generate a bunch of PartialResponseWriter delegate methods anyway (전체 래퍼 디자인 패턴을 무효화)입니다.

getWrapped()에 위임하지 않았으므로 MyFaces를 비난해야하는지 잘 모르겠습니다. PartialResponseWriter documentation은 그것에 대해 충분히 명확하지 않지만, 래퍼 디자인 패턴에서 그러한 접근이 명백하다는 것은 나에게 의미가 있습니다. 모든 구현에서 많은 수의 대리자 메서드를 작성/생성하지 않아도됩니다. 이미 OmniFaces를 사용하는 당신, 당신은 또한 <o:validateOrder> 대신 사용자 정의 유효성 검사기로 사용할 수 주어진 구체적인 문제에 관련없는


.

<f:facet name="input"> 
    <p:calendar id="start" value="#{ticket.start}" pattern="MM/dd/yy HH:mm" stepMinute="15" /> 
</f:facet> 
... 
<f:facet name="input"> 
    <p:calendar id="end" value="#{ticket.end}" pattern="MM/dd/yyyy HH:mm" stepMinute="15" binding="#{editEndDate}" /> 
    <o:validateOrder components="start end" message="The end time must be after the start time." /> 
</f:facet> 

기본적으로 필요한 것입니다.

유효성 검사에 실패한 경우 Ajax#update() 접근법에 관해서는 정확히 왜 이것이 필요한지 확신 할 수 없지만 PrimeFaces는 유효성 검사 실패의 경우 전체 행을 이미 업데이트합니다. 유효성 검사가 성공한 경우 #{myBean.onEdit} 뒤에있는 메서드로 대신 호출 할 수 있습니다.

+0

도움 주셔서 감사합니다. OmniFaces 쇼케이스를 볼 때 유효성 검사기 태그를 보지 못했습니다. 지적 해 주셔서 감사합니다. 'Ajax # update()'에 관해서, PrimeFaces는 유효하지 않은 것으로 표시된 캘린더 입력을 빨간색으로 강조 표시하지 않았으며, 그렇게하도록하는 것이 좋았을 것입니다. 그다지 중요하지 않으므로 지적한 태그를 사용하는 것이 더 쉬울 것이라고 생각합니다. 다시 한 번 감사드립니다! – Ribcakes

+0

당신을 진심으로 환영합니다. 강조 표시에 대해서는 ''이 도움이 될 수 있습니다. 예 : ''를 강조 표시하십시오. – BalusC

+0

''을 사용하는 방법을 잘 모르겠습니다. OmniFaces 쇼케이스를 살펴보면, 폼의 끝 부분에 놓은 것처럼 보이지만,이 경우에는 작동하지 않는 것처럼 보입니다. 나는 또한 달력 안에, 유효성 검사기 후에, 행 편집기에 넣으려고 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다. 고맙습니다. – Ribcakes