我试图在部署到Glassfish(最好也部署到TomEE)时获得对web服务URL端点的控制。
我有一个类:
@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>
如果我访问/context-root/soap/FooPack?wsdl在Glassfish中部署时,我最终得到:
java.lang.ClassCastException: com.foo.FooSoapService cannot be cast to javax.servlet.Servlet
除了一些jax-rs的东西之外,web.xml中几乎没有别的东西了。
任何想法?
那么,您声称是web服务实现类的FooSoapService
类需要实现服务接口,可能是在您的@WebService
注释serviceName
属性中定义的FooService
。
你得到这个异常的原因是因为你的FooSoapService
类不是javax.servlet.Servlet
的实例,它是肯定的,它不需要是一个。在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
glassfish 4.0也有这个功能。