CXF から wsdl2java を使用して Web サービス クライアントを生成すると (wsimport に似たものを生成します)、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 タグが空であるため、単純に 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 にそれを生成させず、完全に回避させる適切でクリーンな方法は何ですか?
そのハックで得られる悪い副作用は何ですか? 何が起こるかをテストすることはまだできないので、誰かが前もって言ってくれたらうれしいです.