私は、CXF Web サイト ( http://cxf.apache.org/docs/jax-ws-configuration.html ) の例と似ていない CXF ベースの Web サービスを飛ばしています。このサービスには、次のサンプル コンテキストに基づいて実装されたエンドポイントがあります。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint id="myServiceMembersImpl"
implementor="#myService"
endpointName="e:MyServiceMembersEndpoint"
serviceName="s:MyServiceMembersService"
address="http://localhost:8080/myservicemembers"
xmlns:e="http://localhost:8080/myservicemembers/ns"
xmlns:s="http://localhost:8080/myservicemembers/ns"/>
</beans>
そしてもちろん、Java...
インターフェース:
package com.me.service;
@WebService
public interface MyService {
String MEMBER = "MEMBER";
@WebResult(name = MEMBER)
Member getMember(@WebParam(name = "memberId") long memberId) throws Exception;
// ...
// more interface declarations
// ...
} // end interface
そして、実装:
package com.me.service.impl;
@WebService(endpointInterface = "com.me.service.MyService")
@Path("/")
public class MyServiceMembersImpl implements MyService {
@GET
@Path("/{id}")
@Consumes({ APP_JSON, APP_XML })
@Produces({ APP_JSON, APP_XML })
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public Member getMember(@PathParam("id") final long memberId) throws Exception {
// ...
// business logic
// ...
return theMember;
} // end method
} // end class
これは、次のように始まる WSDL を返します。
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions name="MyServiceImplService"
targetNamespace="http://localhost:8080/myservicemembers/ns"
xmlns:ns1="**http://service.me.com/**"
xmlns:ns2="http://schemas.xmlsoap.org/soap/http"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8080/myservicemembers/ns"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:import location="http://localhost:8080/myservicemembers?wsdl=**MyService**.wsdl"
namespace="**http://service.me.com/**" />
<wsdl:binding name="MyServiceImplServiceSoapBinding" type="ns1:**MyService**">
<!-- ... -->
</wsdl:definitions>
アプリケーションコンテキストで「jaxws:endpoint」要素を使用してエンドポイントの設定を変更するのは非常に簡単です。これにより、サービス名、エンドポイント名、およびその他のフィールドが具体化されます。ただし、トップレベルのインターフェースは WSDL ファイルで発言権を持っています。上記のスター付きのアイテムは、トップレベルのインターフェースのものです。targetNamespace と serviceName の最上位インターフェイスに値を挿入するにはどうすればよいですか?
これを実行する正当な理由としては、(1) WSDL でパッケージ名を公開したくない、(2) アプリケーションが展開滑走路を下っていくときに名前空間を切り替えたい、などがあります。したがって、アノテーションはコンパイル時の値であるため使用できません。それらをプロパティのプレースホルダーに置き換えることはできません。また、プロダクション層でコードを再コンパイルすることもありません。