2017-01-28 17 views
1

@ManagedProperty은 어떻게 백업 구성 요소에 사용할 수 있습니까?백업 구성 요소에 @ManagedProperty 사용

이것은 파트너 선택기 합성 구성 요소입니다. 구성 요소는 데이터베이스의 입력 된 상대방 코드를 확인하고 코드가 유효하면 파트너 이름을 채 웁니다.

구성 요소 : encodeBegin()에서 나는 service 때문에 NPE를 가지고

<cc:interface componentType="partnerSelComp"> 
    <cc:attribute name="value" type="java.lang.Long"/> 
</cc:interface> 

<cc:implementation> 
    <span id="#{cc.clientId}" style="white-space:nowrap"> 
     <p:inputText id="id" type="hidden" binding="#{cc.partnerId}"/>          
     <p:inputText id="code" binding="#{cc.code}">      
      <p:ajax event="blur" update="id code name" listener="#{cc.validate}" /> 
     </p:inputText>    
     <p:inputText id ="name" disabled="true" binding="#{cc.name}" />     
     <p:message for="code"/> 
    </span> 
</cc:implementation> 

가 null :

@FacesComponent("partnerSelComp") 
    public class PartnerSelComp extends UIInput implements NamingContainer { 

     private InputText partnerId; 
     private InputText code;  
     private InputText name; 

     @ManagedProperty("#{partnerService}") 
     private PartnerService service; 

     @Override 
     public void encodeBegin(FacesContext context) throws IOException { 
      Partner p=null; 
      Long i = (Long) getValue();   

      if (i != null) {    
       p = findPartnerById(service.getList(), i); 
      } 
      fill((i==null) , p); // fills the code and name fields 
     } 

    ... 


    } 

이 내가 액세스하고자하는 콩입니다. (나중에는 JPA 질의로 대체 할 것이다.)

@ManagedBean(name = "partnerService") 
@ApplicationScoped 
public class PartnerService { 

    private List<Partner> list; 

    public PartnerService() { 
     list = new ArrayList<>(); 
     list.add(new Partner(1, "A", "Partner A")); 
     list.add(new Partner(2, "B", "Partner B")); 
     list.add(new Partner(3, "C", "Partner C")); 
     list.add(new Partner(4, "D", "Partner D")); 
     list.add(new Partner(5, "E", "Partner E")); 
     list.add(new Partner(6, "E", "Partner F"));   
    } 

    public List<Partner> getList() { 
     return list; 
    } 

    public void setList(List<Partner> list) { 
     this.list = list; 
    } 

} 

용액 :

성분의 사용 :

<my:PartnerSelComp value="#{myBean.partnerId}" service="#{partnerService}"/> 

성분 XHTML :

<cc:interface componentType="partnerSelComp"> 
     <cc:attribute name="value" type="java.lang.Long"/> 
     <cc:attribute name="service"/> 
    </cc:interface> 

    <cc:implementation> 
     <span id="#{cc.clientId}" style="white-space:nowrap"> 
      <p:inputText id="id" type="hidden" binding="#{cc.partnerId}"/>          
      <p:inputText id="code" binding="#{cc.code}">      
       <p:ajax event="blur" update="id code name" listener="#{cc.validate}" /> 
      </p:inputText>    
      <p:inputText id ="name" disabled="true" binding="#{cc.name}" />     
      <p:message for="code"/> 
     </span> 
    </cc:implementation> 

참고로, 나는 속성 defau로서 참조를 전달하려고 시도했다. 가치 : <cc:attribute name="service" default="#{partnerService}"/><my:PartnerSelComp value="#{myBean.partnerId}"/> 이유는 모르겠지만 그게 효과가 없었습니다. 위에 나온 것처럼 my:PartnerSelCompservice 속성을 설정해야했습니다.

그리고 배면 부품 :

@FacesComponent("partnerSelComp") 
    public class PartnerSelComp extends UIInput implements NamingContainer { 

     private InputText partnerId; 
     private InputText code;  
     private InputText name; 

     @ManagedProperty("#{partnerService}") 
     private PartnerService service; 

     @Override 
     public void encodeBegin(FacesContext context) throws IOException { 
      Partner p=null; 
      Long i = (Long) getValue();   

      PartnerService service = getAttributeValue("service", null);   

      if (i != null) {    
       p = findPartnerById(service.getList(), i); 
      } 
      fill((i==null) , p); // fills the code and name fields 
     } 

     @SuppressWarnings("unchecked") 
     private <T> T getAttributeValue(String key, T defaultValue) { 
      T value = (T) getAttributes().get(key); 
      return (value != null) ? value : defaultValue; 
     } 

    ... 

    } 

내가 참조를 얻을 PartnerService에 캐스팅 getAttributes().get(key)을 사용해야합니다.

답변 해 주셔서 감사합니다. 수동 어쨌든 그것을 얻을해야

<cc:interface componentType="partnerSelComp"> 
    <cc:attribute name="value" type="java.lang.Long"/> 
    <cc:attribute name="service" default="#{partnerService}"/> 
</cc:interface> 

이 빈 클래스의 내부와 같은 HTML 구현의 내부 사용을 위해 대부분입니다 :

+0

구성을 표시하십시오. 대부분의 경우 PartnerSelComp 구성 요소는 구성에 의해로드되지 않는 패키지에 있습니다. –

답변

1

시도는 HTML 구성 인터페이스를 사용하여로드

FacesContext.getCurrentInstance().getAttributes().get("service"); 

@FacesComponent 로의 직접 주입에 대해서는 다음 버전의 JSF (2.3)까지는 불가능합니다.

가능한 해결 방법은 @FacesComponent 대신 "@Named을 사용하거나 그렇게 할 수 없다면 http://omnifaces.org/ 라이브러리의 기능을 사용해보십시오. @FacesConverter에 삽입 할 수 있으므로이 주석에 적용 할 수도 있습니다.

+0

예, bean을 직접 바인드 할 수없고, 속성으로 선언하고 수행 한대로 검색 만 할 수 있습니다. –

+0

도움이 될만한 몇 가지 추가 정보를 추가했습니다. –

+0

도움을 주셔서 감사합니다! – BgY