EJB 2.1 Web 服务端点@WebContext
EJB 2.1 Web Service End Point @WebContext
我有一个定义事件操作的 WSDL 文件。
需要定义一个 SOAP 网络服务端点,它由第三方使用 WSDL 文件中指定的一些参数调用。
项目使用EJB 2.1
无法使端点正常工作(404 错误):
http://localhost:28080/myapp/ws/ClassCallBack
下面的 classes 位于 EAR 文件根文件夹中的 JAR 文件中。
有什么问题吗?
我是否必须在某些 xml 中将此 class 声明为 EJB? (在 ejb-jar.xml 中,声明了所有 EJB 会话 Bean,但这不是会话 Bean)
@WebService
public interface ClassCallBackWs {
@WebMethod
public void event(@WebParam(name = "event") ClassParameter event)
throws Exception;
}
=====================================
@Stateless(name = "ClassCallBackEjb")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@WebService(name = "ClassCallBackWs", portName = "ClassCallBackWs",
serviceName = "ClassCallBackWsService",
targetNamespace = "http://test.serverurl.org.com/",
endpointInterface = "ClassCallBackWs")
@WebContext(contextRoot = "/myapp/ws/",
urlPattern = "/v0/ClassCallBackWsImpl",
transportGuarantee = "NONE", secureWSDLAccess = false)
public class ClassCallBackWsImpl implements ClassCallBackWs {
@WebMethod
public void event(@WebParam(name = "event") ClassParameter event) throws Exception {
}
}
在下面给出一个可能的解决方案示例。
通过在 XML
中定义 JAX WS 端点创建了一个自定义 servlet,它具有到实现 class 的映射
(因为是私有的,所以最终方案的名字都隐去了,如有错误请见谅)
Servlet映射/XML:
<servlet-mapping>
<servlet-name>testws</servlet-name>
<url-pattern>/myapp/ws/v0/</url-pattern>
</servlet-mapping>
XML 用作端点的 servlet 配置:
<jaxws:endpoint
id="CallBackWs" implementor="org.test.ClassCallBackWsImpl "
wsdlLocation="WEB-INF/wsdl/CallBackTest.wsdl"
address="/ClassCallBackWsImpl"
bindingUri="ClassCallBackWsImpl">
</jaxws:endpoint>
终点实现Class:
@WebService(
portName = "CallBackWs",
serviceName = "CallBackWsService",
targetNamespace = "http://test.server.callback.ws/",
endpointInterface = "org.test.CallBackWs")
public class ClassCallBackWsImpl implements ClassCallBackWs{
public void event(ClassParameter event) throws Exception {
}
}
接口class:
@WebService(targetNamespace = "http://test.server.callback.ws/", name = "ClassCallBackWs")
public interface Ws {
@RequestWrapper(localName = "event", targetNamespace = "http://test.server.callback.ws/", className = "org.test.ClassParameter")
@WebMethod
public void event(
@WebParam(name = "event", targetNamespace = "")
org.test.ClassParameter event
) throws Exception;
}
我有一个定义事件操作的 WSDL 文件。
需要定义一个 SOAP 网络服务端点,它由第三方使用 WSDL 文件中指定的一些参数调用。
项目使用EJB 2.1
无法使端点正常工作(404 错误):
http://localhost:28080/myapp/ws/ClassCallBack
下面的 classes 位于 EAR 文件根文件夹中的 JAR 文件中。
有什么问题吗? 我是否必须在某些 xml 中将此 class 声明为 EJB? (在 ejb-jar.xml 中,声明了所有 EJB 会话 Bean,但这不是会话 Bean)
@WebService
public interface ClassCallBackWs {
@WebMethod
public void event(@WebParam(name = "event") ClassParameter event)
throws Exception;
}
=====================================
@Stateless(name = "ClassCallBackEjb")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@WebService(name = "ClassCallBackWs", portName = "ClassCallBackWs",
serviceName = "ClassCallBackWsService",
targetNamespace = "http://test.serverurl.org.com/",
endpointInterface = "ClassCallBackWs")
@WebContext(contextRoot = "/myapp/ws/",
urlPattern = "/v0/ClassCallBackWsImpl",
transportGuarantee = "NONE", secureWSDLAccess = false)
public class ClassCallBackWsImpl implements ClassCallBackWs {
@WebMethod
public void event(@WebParam(name = "event") ClassParameter event) throws Exception {
}
}
在下面给出一个可能的解决方案示例。 通过在 XML
中定义 JAX WS 端点创建了一个自定义 servlet,它具有到实现 class 的映射(因为是私有的,所以最终方案的名字都隐去了,如有错误请见谅)
Servlet映射/XML:
<servlet-mapping>
<servlet-name>testws</servlet-name>
<url-pattern>/myapp/ws/v0/</url-pattern>
</servlet-mapping>
XML 用作端点的 servlet 配置:
<jaxws:endpoint
id="CallBackWs" implementor="org.test.ClassCallBackWsImpl "
wsdlLocation="WEB-INF/wsdl/CallBackTest.wsdl"
address="/ClassCallBackWsImpl"
bindingUri="ClassCallBackWsImpl">
</jaxws:endpoint>
终点实现Class:
@WebService(
portName = "CallBackWs",
serviceName = "CallBackWsService",
targetNamespace = "http://test.server.callback.ws/",
endpointInterface = "org.test.CallBackWs")
public class ClassCallBackWsImpl implements ClassCallBackWs{
public void event(ClassParameter event) throws Exception {
}
}
接口class:
@WebService(targetNamespace = "http://test.server.callback.ws/", name = "ClassCallBackWs")
public interface Ws {
@RequestWrapper(localName = "event", targetNamespace = "http://test.server.callback.ws/", className = "org.test.ClassParameter")
@WebMethod
public void event(
@WebParam(name = "event", targetNamespace = "")
org.test.ClassParameter event
) throws Exception;
}