【问题标题】:retrieve jsf bean in axis2 web service as server request在axis2 Web服务中检索jsf bean作为服务器请求
【发布时间】:2023-04-01 22:06:01
【问题描述】:

我正在使用 eclipse axis2 从 wsdl 创建 Web 服务客户端。

我的 impl 方法是:

public Output[] startProcess(Message[] Messages){
   MyApplicationBean managementBean = (MyApplicationBean) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("myapp");
...
}

但是当我执行时:

http://localhost:8080/MyProject/services/portStartProcessService 带有方法startProcess

我在 tomcat 调试中看到它到达了我的方法,但是 FacesContext.getCurrentInstance() 返回 null。

我的 web.xml(部分)

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
     <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
<servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>

如何在 Web 服务调用中使用 JSF bean(如应用程序范围)?

【问题讨论】:

    标签: java eclipse web-services jsf axis2


    【解决方案1】:

    我知道你现在还不想听到这个,但你把架构弄错了。 JSF 应用程序上下文对 Web 服务调用毫无用处,因为 JSF 的整个想法是 GUI 是由存储的有状态组件构建的:

    • 在用户会话中,或:
    • 在隐藏的表单域中。

    由于 Web 服务调用既不能使用会话也不能使用表单,因此 JSF 不适用于此处。您不妨问一下如何制作一个可以按下 JButton 或将 CD 插入 CD-ROM 的 Web 服务。

    我知道您不需要 JSF 组件,而是需要一些驻留在其中一个托管 bean 中的应用程序逻辑,对吗?

    嗯,最简单的解决方案是获得一台时间机器,及时回到项目计划的时间,并告诉架构师您永远不会将应用程序逻辑放入托管 Bean。原因之一是它们不能用于 Web 服务调用。您的应用程序逻辑应该驻留在由 Spring 或 EJB 提供的服务层中。

    从 Axis 服务和托管 bean 都可以轻松访问 Spring bean 和 EJB,因此您无需从 JSF 前端以外的任何地方访问 JSF 托管 bean。如果您不喜欢 Spring 并且由于某种原因无法使用 EJB,请从 POJO 构建您的服务层,在 ApplicationContextListener 中设置它并在应用程序范围内注册。

    如果没有这种干净的解决方案并且无法进行重构,那么您有两种选择:

      1234563 ,您可以通过消息上下文访问它,而后者又可以通过 Axis 中的静态 MessageContext.getCurrentMessageContext 方法访问)。 1234563这很棘手但可行,这里有一个很好且非常有名的描述:http://www.thoughtsabout.net/blog/archives/000033.html。您需要将需要 servletrequest 和 servletresponse(来自 MessageContext)。您可能可以跳过传递 FacesContext 所需的部分,因为您不需要它来处理任何视图。

    免责声明:我从未尝试过最后一个解决方案 - 它似乎可以工作,尽管它很脏(实际上会导致您的 Web 服务依赖于 JSF,这很奇怪)。

    【讨论】:

    • 非常好的答案。事实上 - 如果你想替换 JSF 应用程序范围 bean,你如何在 spring 中定义一个这样的,一旦服务器启动它就会调用一个方法?
    • @Odelya:在 Web 应用程序中,会创建一个 WebApplicationContext 实例并使用自定义 ApplicationContextListener 注册。这也是创建所有单例 bean 的时间,因此任何标记为初始化(或使用 @PostContruct 注释)的方法都会在应用程序启动之前执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多