2014-04-21 2 views
1

다음 XHTML 코드 (PrimeFaces 5.0 final 관련)가 제공됩니다. 데이터 테이블 필터의 새로운 변경 사항은 here으로 볼 수 있습니다.PrimeFaces 5.0의 데이터 테이블 필터에서 변환기 사용

<p:dataTable id="dataTable" var="row" value="#{testManagedBean}" 
      lazy="true" 
      rowKey="#{row.transporterId}" 
      widgetVar="dataTableUIWidget"> 

    <p:column id="id" headerText="Id" sortBy="#{row.transporterId}"> 
     <h:outputText value="#{row.transporterId}"/> 
    </p:column> 

    <p:column id="transporter" headerText="Transporter" filterBy="#{row.transporterName}"> 
     <f:facet name="filter"> 
      <p:inputText onkeyup="PF('dataTableUIWidget').filter();"/> 
     </f:facet> 
     <h:outputText value="#{row.transporterName}"/> 
    </p:column> 
</p:dataTable> 

다음은 문자열에서 선행 및 후행 공백을 다듬는 faces 변환기입니다.

@FacesConverter(forClass=String.class) 
public final class StringTrimmer implements Converter 
{ 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     return value != null ? value.trim() : null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return (String) value; 
    } 
} 

이 변환기는 데이터 테이블에 규정 된 (이미인가되는 다른 UI 구성 요소를 포함 ) 형 스트링의 모든 필터에 전체적으로 적용 할 수 있을까?

<f:facet name="filter"> 
    <p:inputText onkeyup="PF('dataTableUIWidget').filter();"/> 
</f:facet> 

또는 내가 좋아하는 주석을 가질 컨버터 클래스를 수정해야

@ManagedBean 
@RequestScoped 
public final class StringTrimmer implements Converter 
{ 
    //... 
} 

다음과 같이 질문의 모든 필터를 수동으로 컨버터를 적용,

<f:facet name="filter"> 
    <p:inputText onkeyup="PF('dataTableUIWidget').filter();" converter="#{stringTrimmer}"/> 
</f:facet> 

수 이 변환기는 어떻게 든 모든 문자열 유형 필터에 대해 converter="#{stringTrimmer}"을 명시 적으로 지정할 필요가 없도록 전역 적으로 적용됩니까?

문제는 JSF보다는 PrimeFaces와 더 관련이 있어야한다.

답변

5

UIInput#getValue()의 기본값은 String이 아니기 때문에 기본값 인 Object입니다. UIInput 기반 구성 요소의 value 특성을 String과 같은보다 구체적인 형식의 백업 빈 속성에 명시 적으로 바인딩하지 않으면 특정 변환기가 조회되지 않습니다.

당신이 예에

<p:inputText onkeyup="PF('dataTableUIWidget').filter();"/> 

을 변경하면 그것은 작동합니다

<p:inputText value="#{bean.filter}" onkeyup="PF('dataTableUIWidget').filter();"/> 

private String filter 속성 (및 getter + setter)이 있습니다. 그러나 모델에서이 속성을 사용하지 않으면 혼란 스럽습니다.

대안은 참으로 명시 적으로 converter 속성을 통해 변환기를 선언한다. @FacesConverter 계약에 따르면, 동시에 컨버터 ID 등

@FacesConverter(value="stringTrimmer", forClass=String.class) 
public final class StringTrimmer implements Converter { 
    // ... 
} 

만 컨버터 ID를 등록 할 것이고 경고가에 인쇄됩니다 같은 같은 컨버터 클래스에 대한 최고 수준의 컨버터 모두를 선언 할 수는 없습니다 서버 로그.

경고 : @FacesConverter는 value와 forClass를 모두 사용하며 값만 적용됩니다.

는하지만, 같은 클래스의 모두@ManagedBean@FacesConverter을 가질 수 있습니다.당신은 그들이 서로 협력하지 않으며 완전히 독립적 인 인스턴스가 만들어 질 것임을 이해해야합니다. 그러나 컨버터가 무 상태 (stateless)로 설계된 경우 (즉, 모든 상태가 메소드 블록 내에 유지되고 클래스에 인스턴스 변수/종속성이없는 경우)이 문제가 발생하지 않습니다.

@ManagedBean 
@ApplicationScoped 
@FacesConverter(forClass=String.class) 
public final class StringTrimmer implements Converter { 
    // ... 
} 

당신이 forClass 적용 할 수없는 그 구성 요소에 #{stringTrimmer}를 통해 관리 빈으로 컨버터를 참조 할 수 여전히 forClass의 이익을 가지고 유지하고 있습니다 이쪽으로.

<p:inputText onkeyup="PF('dataTableUIWidget').filter();" converter="#{stringTrimmer}" /> 
+0

매우 정확한 대답입니다. 고맙습니다! – Tiny

+0

반갑습니다. – BalusC

관련 문제