@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:PartnerSelComp
에 service
속성을 설정해야했습니다.
@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 구현의 내부 사용을 위해 대부분입니다 :
구성을 표시하십시오. 대부분의 경우 PartnerSelComp 구성 요소는 구성에 의해로드되지 않는 패키지에 있습니다. –