Maven üzerinden (wsimport benzeri bir şey üretir) wsdl2java kullanarak bir webservice istemci oluşturduğumda, hizmetlerim böyle kodlarla başlar:
@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;
}
Sabit kodlu mutlak yol gerçekten berbat. Oluşturulan sınıf benimkinden başka hiçbir bilgisayarda çalışmaz.
İlk fikir, WSDL dosyasını (artı aldığı her şeyi, diğer WSDL'leri ve XSD'leri) bir jar dosyasına bir yere koymak ve sınıflamaktır. Ama bundan kaçınmak istiyoruz. Bütün bunlar WSDL ve XSD'lere dayanan CXF ve JAXB tarafından üretildiğinden, çalışma zamanında WSDL'yi bilmenin bir anlamı yok.
WsdlLocation özniteliği WSDL konumunu geçersiz kılmak için tasarlanmıştır (en azından bir yerde okudum budur) ve varsayılan değer "". Maven kullandığımız <wsdlLocation></wsdlLocation>
için, kaynak oluşturucuyu wsdlLocation boş bırakmaya zorlamak için CXF yapılandırmasının içine dahil etmeye çalıştık . Ancak, bu boş olduğu için XML etiketini yoksaymasını sağlar. Kullanarak gerçekten çirkin utanç verici bir kesmek yaptık <wsdlLocation>" + "</wsdlLocation>
.
Bu, diğer yerleri de değiştirir:
@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;
}
Yani, sorularım:
Tüm sınıflar CXF ve JAXB tarafından oluşturulmuş olsa bile gerçekten bir WSDL konumuna ihtiyacımız var mı? Evet ise, neden?
WSDL konumuna gerçekten ihtiyacımız yoksa, CXF'nin onu üretmemesini ve tamamen kaçınmasını sağlamanın doğru ve temiz yolu nedir?
Bu hack ile ne gibi kötü yan etkiler elde edebiliriz? Ne olduğunu görmek için bunu hala test edemiyoruz, bu yüzden birisi önceden söyleyebilirse, iyi olurdu.
classpath:
,<wsdlLocation...
satırı atlayın .