一句话:@ManagedProperty注解返回null而不是注入属性。
详细信息:有两个类:
@ManagedBean(name="authFilter")
@SessionScoped
public class AuthFilter implements Filter {
@ManagedProperty("#{loginBean}")
private LoginBean loginBean;
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
...
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean {
...
}
Run Code Online (Sandbox Code Playgroud)
现在,AFAIK的@ManagedProperty注解和设置器应该足以注入属性,或者至少此处和BalusC的博客中的其他问题建议了这一点,但仍然始终存在null。
这也很有趣,并且可能与此问题有关,我收到这些类的警告,即使它们仅通过faces-config.xml或带有注解进行了注册,但它们已经被注册为托管bean 。(分别对它们进行了试验,没有任何区别。)如果它们都不存在,则警告消失,但是对c无效@ManagedProperty。
WARNING: JSF1074: Managed bean named 'confListBean' has already been registered. Replacing existing managed bean class type <projectname>.web.authFilter with <projectname>.web.authFilter.
Run Code Online (Sandbox Code Playgroud)
因此,问题将是:
@ManagedProperty要注入我没有做的事情还需要什么?@notations和之外,还可以“过度注册”这些托管Bean faces-config.xml吗?是否存在收集我可以检查的托管bean的过程的跟踪?我在 中设置了一个带有 POJO 和转换器的 selectOneMenu,p:dialog请参阅下面的源代码。它确实有效,除了最初,当它第一次以非下拉状态显示时,会选择第一个选项,而不是与 bean 值对应的选项。如果我保存 selectOneMenu 的状态而不与之交互,则会保存最初选择的第一个选择,因此实际值会被覆盖,但如果我选择不同的选择,则会正确保存。selectOneMenu 绑定到的 bean 值不能是null。
我调试了转换器,结果发现,当加载后备数据并且刷新并显示对话框时,所有选择都会经过转换器,再加上再次getAsString()选择实际 bean 值。尽管如此,第一个选项仍然被实际选中并显示在 selectOneMenu 中。当提交对话框的表单时,实际选择的选择将通过转换器的,无论这是错误选择的初始值还是手动选择的初始值。getAsObject()
请告知可能是什么问题。
调用对话框的按钮的 xhtml,其形式不同:
<p:commandButton id="toolbarEditButton"
value="Edit selected" update=":editMediaForm"
disabled="#{!contentManager.mediaSelected}"
actionListener="#{contentManager.editSelectedMedia}"
onclick="PF('editMediaWidget').show()" />
Run Code Online (Sandbox Code Playgroud)
对话框的xhtml:
<p:dialog id="editMediaDialog" widgetVar="editMediaWidget"
modal="true" resizable="false" >
<h:form id="editMediaForm" >
<p:panelGrid rendered="#{contentManager.isMediaSelected()}" columns="2" >
... <!-- other properties of the selected element -->
<p:outputLabel value="Media type" />
<p:selectOneMenu value="#{contentManager.selectedMedia.mediaType}"
converter="#{mediaTypeConverter}">
<f:selectItems value="#{mediaTypeConverter.allMediaTypes}"
var="mt" itemLabel="#{mt.name}" itemValue="#{mt}" />
<p:ajax listener="#{contentManager.onMediaTypeChanged()}" />
</p:selectOneMenu>
</p:panelGrid> …Run Code Online (Sandbox Code Playgroud)