gpt4 book ai didi

java - 在支持组件中使用 @ManagedProperty

转载 作者:行者123 更新时间:2023-11-30 02:40:24 24 4
gpt4 key购买 nike

如何使用@ManagedProperty在支持组件中?

这是合作伙伴选择器复合组件。该组件检查数据库中输入的合作伙伴代码,如果代码有效,则填写合作伙伴名称。

组件:

<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>

encodeBegin()我得到 NPE 因为 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();

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

...


}

这是我想要访问的 bean。 (稍后它将替换为 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>

我注意到,我尝试将引用作为属性默认值传递:<cc:attribute name="service" default="#{partnerService}"/><my:PartnerSelComp value="#{myBean.partnerId}"/>我不知道为什么,但这对我不起作用,我必须设置 service my:PartnerSelComp 中的属性正如您在上面看到的。

以及支持组件:

    @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;
}

...

}

我必须使用getAttributes().get(key)获取引用并将其转换为 PartnerService .

感谢您的回答。

最佳答案

尝试使用html配置界面加载:

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

这主要用于 html 实现内部的使用,因为在 bean 类内部,您无论如何都必须手动获取它:

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

关于直接注入(inject) @FacesComponent,直到下一个版本的 JSF (2.3) 才可能实现。

一个可能的解决方法是使用 "@Named 而不是 @FacesComponent,或者如果您无法做到这一点,请尝试 http://omnifaces.org/ 的一些功能。库。它允许注入(inject)@FacesConverter,所以也许您也可以将它应用于此注释。

关于java - 在支持组件中使用 @ManagedProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com