在seam中配置Web服务(“无活动应用程序上下文”)

时间:2012-04-19 19:20:10

标签: web service jboss

我正在使用seam 2.0.1构建一个Web服务,并将其部署在jboss 4.2.2 GA上。我有我的Web服务类访问另一个类(更新数据库中的东西)。

我在META-INF文件夹中有standard-jaxws-endpoint-config.xml

@Name("pluginHandler")
@Scope(ScopeType.APPLICATION)  
@Install(precedence = Install.BUILT_IN)
@Startup(depends = "someclass")

@Stateless
@WebService(name = "Plugin", serviceName = "PluginService")


public class PlugInHandler {

@WebMethod
public int processRequest(Account account)
{

    Workbench wb = Component.getInstance("Workbench");
    //above line keeps throwing exception "No application context active"

    }

}

我一直在寻找不同的论坛,但我找不到解决方案。我尝试使用Lifecycle.begincall()Lifecycle.endCall(),但没有任何效果。 我还需要web.xml吗?如果是,web.xml应包含哪些信息? 任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

我认识到这个问题已经过时了,但对那些仍然分享你(现在是我的)困境的那些可怜的灵魂来说,这里有一些指针(从各种来源拖拽,但主要来自{{3 }}):

Java EE WebService

首先,使用JBoss 4.2.2可能意味着使用Java EE5。那里的Web服务(有或没有SEAM 2)只能在无状态会话Bean之上创建。 Java EE 5中的无状态会话Bean需要实现使用@Local或@Remote注释的服务端点接口。虽然这在Java EE6中已经成为可选项,但它仍然是强制性的。

所以:

@Local
public interface PluginHandlerInterface {
   int processRequest(Account account);
}

@WebService
@Stateless
public PluginHandler implements PluginHandlerInterface { }

POJO WebService

如果在seam中,您想要使用常规POJO作为Web服务,那么您的类必须有另一个特殊注释来定义Handler链:

@WebService
// This here makes all the difference!
@HandlerChain(file = "web-service-handler-chain.xml")
public class PluginHandler {
    ...
}

这是您放入/WEB-INF/classes/web-service-handler-chain.xml的处理程序链:

<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <description>seam request handler</description>
      <!-- probably not necessary
         <handler-name>org.jboss.seam.webservice.SOAPRequestHandler</handler-name>
      -->
      <handler-class>org.jboss.seam.webservice.SOAPRequestHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

你必须将你的服务类公布给war文件web.xml,如下所示:

<listener> <!-- this might already be present in your web.xml -->
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>
<servlet> <!-- Which class is to be used? -->
    <servlet-name>PluginHandler</servlet-name>
    <servlet-class>your.package.name.PluginHandler</servlet-class>
</servlet>
<servlet-mapping> 
    <!-- you'll find it under http://localhost:8080/your-war/PluginHandler?wsdl-->
    <servlet-name>PluginHandler</servlet-name>
    <url-pattern>/PluginHandler</url-pattern>
</servlet-mapping>

所以这三个步骤,创建处理程序链,添加注释并向web.xml宣布您的服务,应该在SEAM中为您做到这一点:您将拥有一个Web服务和SEAM上下文可用它