部署到Glassfish时,我试图控制我的Web服务的URL端点(最好也是TomEE)。
我有一个班级:
@Stateless
@WebService(
targetNamespace = "http://foo.net/doc/2012-08-01",
name = "FooService",
portName = "FooPort",
serviceName = "FooService")
public class FooSoapService extends SoapBase {
...
}
还有一个web.xml:
<servlet>
<description>SOAP Endpoint for Foo operations.</description>
<servlet-name>Foo</servlet-name>
<servlet-class>com.foo.FooSoapService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FooPack</servlet-name>
<url-pattern>/soap/FooPack</url-pattern>
</servlet-mapping>
如果我在Glassfish中部署时访问/ context-root / soap / FooPack?wsdl,我最终得到:
java.lang.ClassCastException: com.foo.FooSoapService cannot be cast to javax.servlet.Servlet
除了一些jax-rs之外,web.xml中几乎没有其他内容。
有什么想法吗?
答案 0 :(得分:0)
那么,您声称是Web服务实现类的FooSoapService
类需要实现服务接口,可能是FooService
注释@WebService
属性中定义的serviceName
您获得此异常的原因是因为您的FooSoapService
类不是javax.servlet.Servlet
的实例,并且确定它不需要是一个。{1}}类。在您的web.xml中,您无法公开Web服务端点。它需要通过sun-jaxws.xml
完成。像这样:
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="FooPort" implementation="com.foo.FooSoapService" url-pattern="/services/FooService"/>
</endpoints>
你的web.xml应该是这样的:
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>Foo</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Foo</servlet-name>
<url-pattern>/services/FooService</url-pattern>
</servlet-mapping>
如果您要进行这些更改,那么您将能够从以下位置获取WSDL:
/context-root/services/FooService?wsdl
答案 1 :(得分:0)
glassfish 4.0也具备此功能。配置可以无错误地部署。