Java 如何从不是JSFbean的类创建FacesMessage?

Java 如何从不是JSFbean的类创建FacesMessage?,java,jsf,Java,Jsf,我是JSF新手,正在努力解决一个问题。我希望有人能帮助我 问题: 不是bean的处理程序检测来自TCP/IP管道的消息 处理程序需要创建一个新的FacesMessage,以在消息框中显示消息 由于处理程序不是bean,FacesContext返回null,因此处理程序无法写入FacesMessage 问题: 有没有可能做我想做的事 将外部消息从非bean的Java类传播到FacesMessage以便显示在UI上的最佳方式是什么 关于如何解决这个问题有什么想法吗?不,这是不可能的,另一种方法是

我是JSF新手,正在努力解决一个问题。我希望有人能帮助我

问题:

  • 不是bean的处理程序检测来自TCP/IP管道的消息
  • 处理程序需要创建一个新的
    FacesMessage
    ,以在消息框中显示消息
  • 由于处理程序不是bean,
    FacesContext
    返回
    null
    ,因此处理程序无法写入
    FacesMessage
问题:

  • 有没有可能做我想做的事
  • 将外部消息从非bean的Java类传播到
    FacesMessage
    以便显示在UI上的最佳方式是什么

  • 关于如何解决这个问题有什么想法吗?

    不,这是不可能的,另一种方法是通过
    @ManagedBean
    注释或在faces-config.xml中添加类似的条目来创建支持bean

      <managed-bean>
        <managed-bean-name>bean</managed-bean-name>
        <managed-bean-class>com.test.bean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    
    豆
    com.test.bean
    一场
    

    现在您可以获得
    facesContext
    和创建
    FacesMessage
    这两个功能,希望这对您有所帮助

    FacesContext.getCurrentInstance()方法仅在实际的faces会话中返回有效的faces上下文。我认为您应该考虑这样做,即您的类进行TCP/IP消息处理,为faces托管bean提供一种方法,使其能够将消息的信息获取到前端,然后从托管bean访问该方法

    根据您使用的应用程序服务器的类型,您可能希望将整个过程设置为通过EJB会话bean进行交互。但实际上,任何支持bean或faces的逻辑都应该与与UI无关的逻辑完全分开


    如果您使用的是兼容JEE6的应用程序服务器(如Glassfish),则可以设置@Singleton EJB来保存一组消息(确保使用支持并发的数据结构)和类似JCA套接字的内容(http://code.google.com/p/jca-sockets/)处理套接字通信

    嗯,我的问题是我的处理程序不能是一个bean,所以我没有选择将它转换成bean,这样我就可以这样做。有没有其他方法可以将消息从外部Java类显示到JSF UI?是的……我在考虑使用一个单例bean,然后对该bean进行JNDI查找,并调用addMessage,后者反过来使用FacesContext,但该bean也会为FacesContext返回null?单例bean不同于JSF支持bean。虽然它们都叫豆子,但它们不是完全一样的东西。EJB/JEE层与JSF的视图层是分开的。您最终要做的是将您的单例注入到一个支持bean中(您将使用所描述的XML描述符来设置支持bean,或者您可以使用注释来设置它)好的,我认为这不会起作用,原因如下:1-我的处理程序代码是检测事件的代码,它不是一个bean。2-我的处理程序代码需要以某种方式将消息传播到UI。3-我的处理程序代码当时没有访问bean的权限。因此,在本例中没有bean注入到另一个bean中,因为没有正在处理的请求。上面步骤1中的处理程序代码只是一个检测和处理事件的线程。如果您反对将处理程序转换为bean,您可能希望使处理程序代码查找成为JMS消息队列,然后将消息发送到MDB以将其放入应用程序服务器。或者您可以通过Web服务与应用程序服务器通信。。。不管是哪种方式,您都需要做一些事情来让它对JSF前端可用。所以你可以向faces页面发出请求,如果你想这样做的话。。。也许您可以创建一个应用程序范围的托管bean,并通过对JSF页面的请求来操作其中的值?这样做仍然感觉有点不对,但这是一种你可以得到你想要的东西的方法。