未设置JSF 2.0@ManagedProperty
我刚刚开始使用JSF,我不明白为什么我的服务没有注入到我的控制器中未设置JSF 2.0@ManagedProperty,jsf,jsf-2,Jsf,Jsf 2,我刚刚开始使用JSF,我不明白为什么我的服务没有注入到我的控制器中 @ManagedBean @ApplicationScoped public class MyController { @ManagedProperty(value = "#{service}") private MyService service; public void setService(MyService service) { this.service = service;
@ManagedBean
@ApplicationScoped
public class MyController {
@ManagedProperty(value = "#{service}")
private MyService service;
public void setService(MyService service) {
this.service = service;
}
public MyService getService() {
return service;
}
public void callToService(AjaxBehaviorEvent event) {
System.out.println(service);
}
}
Q:ManagedProperty@ManagedProperty
中的值的用途是什么?
@ManagedBean
@ApplicationScoped
public class MyService {
}
单击按钮调用方法callToService
,但服务为null
<h:form>
<h:commandButton value="Call Service">
<f:ajax listener="#{myController.callToService}"/>
</h:commandButton>
</h:form>
当
{service}
实际解析为null
时,可能会发生这种情况
<h:form>
<h:commandButton value="Call Service">
<f:ajax listener="#{myController.callToService}"/>
</h:commandButton>
</h:form>
当您使用@ManagedBean
而不使用name
属性时,托管bean名称将默认解析为第一个字符小写的类名(至少符合Javabeans规范),因此您的MyService
bean将有效地获得MyService
的托管bean名称
所以基本上有两种方法来解决这个问题
{myService}
@ManagedProperty("#{myService}")
private MyService service;
{service}
@ManagedBean(name="service")
@ApplicationScoped
public class MyService {
}
与具体问题无关,因为您似乎对ajax事件不感兴趣,而是对action事件感兴趣,所以您还可以简化
的使用,如下所示:
<h:commandButton value="Call Service" action="#{myController.callToService}">
<f:ajax />
</h:commandButton>
这样,当终端用户没有启用JS时,它仍然可以工作
最后,业务服务通常被设计成一个无状态的EJB,而不是JSF管理的bean,因为它应该与JSF视图没有直接关系。然后你就可以使用
@EJB
private MyService service;
我按照你的建议使用了
@EJB
,但它不起作用。我想我需要更改MyService
的注释,因为它不再是托管bean。是的,使用@Stateless
。请注意,您需要一个支持EJB的servletcontainer,例如Glassfish、JBoss等。我使用Tomcat6,但我使用maven在我的类路径中添加了openejb
。为了确保,MyService
只需要@无状态
?因为我得到这个异常:由以下原因引起:javax.naming.NameNotFoundException:Name com.xxxxxxxx.controller.MyController不在此上下文中绑定抱歉,我没有使用Tomcat+OpenEJB的实际操作经验。但是,文件中指出,它应该可以正常工作: