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

时间:2013-03-01 11:02:34

标签: java-ee servlets glassfish jax-ws

部署到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中几乎没有其他内容。

有什么想法吗?

2 个答案:

答案 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也具备此功能。配置可以无错误地部署。