Glassfish web.xml servlet映射到@WebService获取ClassCastException



我试图在部署到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也有这个功能。

最新更新