3

当部署到 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>

如果我在 Glassfish 中部署时访问 /context-root/soap/FooPack?wsdl 我最终会得到:

java.lang.ClassCastException: com.foo.FooSoapService cannot be cast to javax.servlet.Servlet

除了一些 jax-rs 的东西外,web.xml 中几乎没有其他内容。

有任何想法吗?

4

2 回答 2

1

好吧,FooSoapService您声称是 Web 服务实现类的类需要实现服务接口,可能FooService在您的@WebService注释serviceName属性中定义。

你得到这个异常的原因是你的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
于 2013-03-01T13:55:37.727 回答
0

glassfish 4.0 也有这种能力。配置是可部署的,没有错误。

于 2014-09-05T04:44:52.897 回答