SORU
15 Aralık 2010, ÇARŞAMBA


Nasıl bir veya CXF JAX-WS WSDL konumunu belirtmek için ihtiyaç önlemek için oluşturulan Java eklentisi istemci?

Java eklentisi bir istemci CXF bir şey wsimport oluşturur) wsdl2java kullanarak oluşturmak, maven), hizmetlerimi böyle: kodları ile 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;
    }

Kodlanmış mutlak yol gerçekten berbat. Üretilen sınıfın diğer bilgisayar benimkinden başka işe yaramaz.

İlk fikir WSDL (artı alır her şeyi, diğer wsdl'leri de ve XSDs) bir yerde bir jar-dosya ve sınıf koymaktır. Ama bunu önlemek istiyoruz. Bütün mesele bu CXF ve JAXB wsdl'leri de ve XSDs merkezli tarafından oluşturulan bu yana, zamanında WSDL bilmek gerek manası görüyoruz.

WsdlLocation özniteliği WSDL konum (en azından ben bu yere okunan nedir) geçersiz kılmak için tasarlanmıştır, ve varsayılan değer "". Maven kullanıyorsanız bu yana, CXF yapılandırmasını kaynak jeneratör wsdlLocation boş bırakmaya zorlamak için içinde <wsdlLocation></wsdlLocation> dahil etmeye çalıştık. Ancak, bu sadece boş olduğundan XML etiketi görmezden yapar. Gerçekten çok çirkin bir utanç verici hack, <wsdlLocation>" "</wsdlLocation> kullanarak yaptık.

Bu da diğer yerlerde değişiklikler:

@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 benim sorular şunlardır:

  1. Gerçekten eğer tüm sınıfları CXF ve JAXB tarafından oluşturulmuş olsaydı bile WSDL bir konuma ihtiyacı var mı? Evet ise, neden?

  2. Eğer gerçekten WSDL konuma ihtiyacımız var değilse, CXF oluşturup tamamen kaçınarak yapmak için değil, doğru ve temiz yolu nedir?

  3. Ne yapabiliriz kötü yan etkileri hack? Biz hala o ne olacağını görmek için test edebilir mi, eğer birisi şimdiden özür olsaydı, güzel olurdu.

CEVAP
26 Mart 2012, PAZARTESİ


Sonunda bu soru bugün cevabını tam olarak anladım.

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration> 
                <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${project.basedir}/src/main/resources/wsdl/FooService.wsdl</wsdl>
                        <wsdlLocation>classpath:wsdl/FooService.wsdl</wsdlLocation>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

classpath: wsdlLocation değeri öneki dikkat ettim. Bu wsdl mutlak bir yol yerine bir sınıf olacak eklenti söyler. Sonra buna benzer bir kod oluşturur:

@WebServiceClient(name = "FooService", 
                  wsdlLocation = "classpath:wsdl/FooService.wsdl",
                  targetNamespace = "http://org/example/foo") 
public class Foo_Service extends Service {

    public final static URL WSDL_LOCATION;

    public final static QName SERVICE = new QName("http://org/example/foo", "Foo");
    public final static QName FooSOAPOverHTTP = new QName("http://org/example/foo", "Foo_SOAPOverHTTP");
    static {
        URL url = Foo_Service.class.getClassLoader().getResource("wsdl/FooService.wsdl");
        if (url == null) {
            java.util.logging.Logger.getLogger(Foo_Service.class.getName())
                .log(java.util.logging.Level.INFO, 
                     "Can not initialize the default wsdl from {0}", "classpath:wsdl/FooService.wsdl");
        }       
        WSDL_LOCATION = url;
    }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • paulandstorm

    paulandstorm

    4 EYLÜL 2006
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012
  • Videojug

    Videojug

    25 EKİM 2006