Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未设置JSF 2.0@ManagedProperty_Jsf_Jsf 2 - Fatal编程技术网

未设置JSF 2.0@ManagedProperty

未设置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;

我刚刚开始使用JSF,我不明白为什么我的服务没有注入到我的控制器中

@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;
    
  • 自己指定托管bean名称,使其成为可用的
    {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的实际操作经验。但是,文件中指出,它应该可以正常工作: