- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用@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/
我想让数据库对象仅在需要时才创建,所以我想做这样的事情 public class Data { public List getGroups(){ List MyList=new ArrayLi
如何使用@ManagedProperty在支持组件中? 这是合作伙伴选择器复合组件。该组件检查数据库中输入的合作伙伴代码,如果代码有效,则填写合作伙伴名称。 组件:
@ManagedProperty("#{sessionBean}") 未正确注入(inject)。 sessionBean 在 JAR 文件中声明,它也有一个 JSF 2.0 兼容的 faces-co
我正在尝试在多个 SessionScoped bean 之间共享一个对象。虽然我收到了错误,但我真的不知道为什么。 @ManagedProperty(value="#{tb}") private te
我问的问题可能是一个非常简单的问题。我想在登录成功后显示用户详细信息。 我的登录 Controller public LoginController() { } public String get
我正在使用 Spring 和 JSF 2 创建一个 Web 应用程序。 业务对象保存在 Spring 容器中,我使用 @ManagedProperty 将它们注入(inject)托管 Bean,如下所
我正在尝试通过以下方式在我的 FacesConverted 中注入(inject)一个 ManagedBean: @ManagedBean @RequestScoped @FacesConverter
这个问题在这里已经有了答案: Backing beans (@ManagedBean) or CDI Beans (@Named)? (5 个回答) 6年前关闭。 好的,所以我有一个需要引用另一个 (
我正在尝试将 Richfaces 4 展示中的一些代码转换为使用 CDI 而不是 JSF 注释。 我知道我可以使用 @Named 来替换 @MangedBean 和 @Inject 来替换 @Mana
我有两个 jsf Controller ,分别是 ControllerA 和 ControllerB。两者都在 session 范围内。我想从 ControllerA 调用 ControllerB 中
我有一个我正在构建的 JSF 验证器,其中包含我想从 ResourceBundle 加载的属性。但是,我不太确定如何工作,因为它没有正确加载。关于如何完成这项工作的任何想法? 我试过使用 @PostC
我试图将一个 session 范围的 bean 的值注入(inject)一个 View 范围的 bean,但它一直返回 null,这是一个片段: import javax.faces.applicat
我有一个 CDI 托管 bean,我想将请求参数设置为托管属性: import javax.inject.Named; import javax.enterprise.context.RequestS
我需要在同一个 bean 上设置 2 个不同的 ManagedProperty。所以我试过: @ManagedBean(name="selector") @RequestScoped public c
我试图通过 @ManagedProperty 注释将整个 JSF 托管 bean 注入(inject)另一个托管 bean(非常类似于 Possible to inject @ManagedBean
我是 JSF 的新手,我想知道是否可以根据不同的情况将基类的不同子类作为 MangedProperty 注入(inject)?例如,我有这个托管 bean: @ManagedBean @Session
我的 bean 有这个: @ManagedBean @ViewScoped public class BookBean implements Serializable { @Man
首先我想说我是 JSF 的新手。 我想创建简单的复合组件,可用于编辑文章。它应该以这种方式工作: 复合组件看起来像这样 ArticleBean负责复合组件的数据处理(这里是save方法) 每个想要使
像这样定义 View 参数有什么区别: 并在 ManagedBean 中定义属性,如下所示: @Inject @ManagedProperty(value = "#{param.id}")
我尝试学习 JSF 并遇到与 ManagedProperty 相关的问题。但是我尝试使用它,它总是失败 - 异常指针为空。我做错了什么? 我在stackoverflow上阅读了一些“类似的帖子”,但它
我是一名优秀的程序员,十分优秀!