Yeah, as long as you wouldn't say the API is likely to change in
future releases, I'm happy hooking into that. (And even if it does, I
can fall back to reading the WSDL myself). Is there an example that
demonstrates the necessary breadcrumbs?

Cheers,

Andrew.

2009/2/19 Benson Margulies <[email protected]>:
> Superfically, looks like you could call that API, yes. It's used
> internally to set up validation. Of course, you'd need to follow a
> trail of breadcrumbs to the CXF-specific Service object to get there.
> Is that the issue?
>
> On Thu, Feb 19, 2009 at 7:55 AM, Andrew Clegg <[email protected]> wrote:
>> So the EndpointReferenceUtils.getSchema( serviceInfo ) approach is
>> only for @WebService classes and not @WebServiceProvider classes?
>>
>> Andrew.
>>
>> 2009/2/19 Benson Margulies <[email protected]>:
>>> CXF does not precisely have a 'copy' of the WSDL. It has a wsdl4j
>>> representation.
>>>
>>> On the 2.2 branch, there is an XmlSchemaCollection of the schemas. In
>>> earlier branches, it has a DOM copy of them.
>>>
>>> We could, I suppose, expose. I'm hoping that Dan will wade in at this point.
>>>
>>>
>>> On Thu, Feb 19, 2009 at 5:42 AM, Andrew Clegg <[email protected]> 
>>> wrote:
>>>> Followup...
>>>>
>>>> So I've got this working by reading the WSDL myself in the provider
>>>> class's constructor:
>>>>
>>>>
>>>> // First read WSDL
>>>> ClassLoader loader = this.getClass().getClassLoader();
>>>> InputStream wsdlFile = loader.getResourceAsStream( WSDL_NAME );
>>>> Document wsdl = org.apache.cxf.helpers.DOMUtils.readXml( wsdlFile );
>>>>
>>>> // Then get schema body from WSDL -- TODO tighten up query using namespaces
>>>> String schemaQuery =
>>>> "//*[local-name()='definitions']/*[local-name()='types']/*[local-name()='schema']";
>>>> XPathExpression schemaPath = xp.compile( schemaQuery );
>>>> Node schemaNode = ( Node ) schemaPath.evaluate( wsdl, XPathConstants.NODE 
>>>> );
>>>>
>>>> // Then compile it and store it
>>>> String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
>>>> SchemaFactory sf = SchemaFactory.newInstance( language );
>>>> DOMSource ds = new DOMSource( schemaNode );
>>>> this.schema = sf.newSchema( ds );
>>>>
>>>>
>>>> This lets me easily validate messages in the invoke() method, for example:
>>>>
>>>>
>>>> schema.newValidator().validate( domRequest );
>>>>
>>>>
>>>> where domRequest is the DOMSource of the message payload.
>>>>
>>>> However it still seems a little inelegant to read the WSDL myself when
>>>> CXF must have a copy.
>>>>
>>>> I've found the getSchema() method of the EndpointReferenceUtils class
>>>> via an old thread on here, but that requires a ServiceInfo object --
>>>> is there any way to acquire one of these for a Provider service?
>>>>
>>>> Thanks,
>>>>
>>>> Andrew.
>>>>
>>>> 2009/2/16 Andrew Clegg <[email protected]>:
>>>>> Hi folks,
>>>>>
>>>>> From inside a Provider implementation, how can I obtain the schema of
>>>>> the service's request/response messages, short of reading the WSDL
>>>>> myself and extracting the schema from it?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Andrew.
>>>>>
>>>>> --
>>>>> :: http://biotext.org.uk/ ::
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> :: http://biotext.org.uk/ ::
>>>>
>>>
>>
>>
>>
>> --
>> :: http://biotext.org.uk/ ::
>>
>



-- 
:: http://biotext.org.uk/ ::

Reply via email to