我正在使用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
应包含哪些信息?
任何帮助都将受到高度赞赏。
答案 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上下文可用它