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

さて、FooSoapServiceWeb サービス実装クラスであると主張しているクラスは、おそらく注釈プロパティFooServiceで定義されているサービス インターフェイスを実装する必要があります。@WebServiceserviceName

この例外が発生する理由は、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 に答える