Hi David,

I'd think the way to handle this would be to use the service constructor
that takes a WSDL URL. You can find the URL at runtime for a file in the
classpath by using the classloader getResource(String name) method.

  - Dennis

On 11/03/2010 10:49 AM, KARR, DAVID (ATTSI) wrote:
>> -----Original Message-----
>> From: KARR, DAVID (ATTSI)
>> Sent: Monday, November 01, 2010 12:54 PM
>> To: [email protected]
>> Subject: How to specify wsdlLocation for wsdl bundled in jar?
>>
>> I'm trying to produce a "client" jar that includes my generated
>>     
> classes
>   
>> and my wsdl and schema.
>>
>> At the root of the jar file, where the "com" directory exists, I also
>> have a "contract" directory, that has a subdir that specifies a
>> contract
>> version number.  In that directory is my wsdl and schemas.
>>
>> In my call to "wsdl2java", I tried specifying
>> "classpath:contract/<versiondir>/<wsdlfilename>".
>>
>> When I generate this and then run it in the container, I see this in
>> the
>> console:
>>
>>     "Can not initialize the default wsdl from classpath:contract/..."
>>
>> What should the "wsdlLocation" value be?  Do I just remove
>>     
> "classpath:"
>   
>> from it?  I thought it had to be a URL, so that seems unlikely.
>>     
> I've gotten past this for now, but there's at least one issue here that
> is somewhat mystifying.  From what I've read about the idea of having a
> classpath-based URLStreamHandler, the two options are installing the
> handler into the JVM or calling the overloaded URL constructor, along
> with the instance of the overloaded stream handler.  I'm not willing to
> install it into the JVM at this point, although I might consider this
> later (perhaps just to avoid the innocuous "Can not initialize the
> default wsdl ..." message at load time).
>
> I now have a static block in a utility class that creates the Service
> subclass instance, and it uses the URL constructor that takes a URL,
> String, and URLStreamHandler.  I pass "classpath:..." as the second
> parameter and an instance of my "ClasspathURLStreamHandler" which gets
> the system classloader as a constructor argument.
>
> My ClasspathURLStreamHandler is just this:
> ------------------
>     public class ClasspathURLStreamHandler extends URLStreamHandler {
>         private final ClassLoader classLoader;
>
>         public ClasspathURLStreamHandler(ClassLoader classLoader) {
>             this.classLoader = classLoader;
>         }
>
>         @Override
>         protected URLConnection openConnection(URL url) throws
> IOException {
>             final URL resourceUrl =
> classLoader.getResource(url.getPath());
>             return resourceUrl.openConnection();
>         }
>     }
> ------------------
>
> It now apparently finds my WSDL, because I can get the porttype and call
> the operation.
>
> However, what's sort of odd is that it apparently never gets into the
> "openConnection()" method.  So, it seems like this isn't doing anything.
>
> On the other hand, I tried changing to use the "URL(String spec)"
> constructor, but that fails with a MalformedUrlException.
>
> So, somehow by specifying a URLStreamHandler, even though it's not
> actually using it, it causes some sort of default behavior that does
> exactly what I'm trying to do, which is looking up the "spec" in the
> classpath.
>
>   

Reply via email to