CXFからwsdl2java(wsimportに似たものを生成)を使用してWebサービスクライアントを生成すると、mavenを介して、サービスは次のようなコードで始まります。
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
ハードコードされた絶対パスは本当に厄介です。生成されたクラスは、私のコンピューター以外では動作しません。
最初のアイデアは、WSDLファイル(およびそれがインポートするすべてのもの、他のWSDLおよびXSD)をjarファイルのどこかに置き、それをクラスパス化することです。しかし、これは避けたいです。これらすべては、WSDLとXSDに基づいてCXFとJAXBによって生成されたので、実行時にWSDLを知る必要がないのはわかりません。
wsdlLocation属性は、WSDLの場所をオーバーライドすることを目的としており(少なくとも、これはどこかで読み取ったものです)、そのデフォルト値は ""です。Mavenを使用しているため<wsdlLocation></wsdlLocation>
、CXFの構成内に含めて、ソースジェネレーターがwsdlLocationを空白のままにするように強制しようとしました。ただし、これにより、XMLタグは空であるため、単に無視されます。私たちは本当に醜い恥ずべきハックをしました<wsdlLocation>" + "</wsdlLocation>
。
これは他の場所も変更します:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
だから、私の質問は:
すべてのクラスがCXFとJAXBによって生成された場合でも、WSDLの場所が本当に必要ですか?はいの場合、なぜですか?
WSDLの場所が本当に必要ない場合、CXFがそれを生成せず、完全に回避するための適切でクリーンな方法は何ですか?
そのハックでどのような悪い副作用が発生する可能性がありますか?何が起こるかを確認するためにまだテストすることはできないので、誰かが前もって言うことができればそれは素晴らしいでしょう。
classpath:
は、<wsdlLocation...
行を省略します。