Definitely log a bug for this (and provide a test case if possible).

If you would like to start digging into it, I can point out some places to 
start your investigation:

JAXBDataBinding - in the generateJaxbSchemas() method, put a breakpoint or 
println or something in the createOutput() method of the SchemaOutputResolver 
to see if JAXB is even trying to output anything for those schemas. 

If JAXB is NOT trying to output anything, then we'll need to loop through the 
packages in the context list and check for the @XmlSchema package level 
annotations ourselves and pull them in.    Not a big deal.    The 
contextClasses set contains all the classes, just loop through them looking 
for package-infos with the annotation.  


If JAXB IS calling the createOutput() method for those, then we're most likely 
stripping off a schemaLocation attribute in the addSchemaDocument(..) of the 
superclass (AbstractDataBinding).    That will be a bit trickier to workaround 
as most of the time, we do want that stipped off for generated schema (so it's 
properly inlined in the wsdl).     Before going down this route, it would be 
good to see the results of the first check above.

Thanks!
Dan



On Mon February 16 2009 5:14:36 pm Chris McClelland wrote:
> Hi,
>
> Someone pointed out to me today that the JAXB xjc/schemaGen transformations
> are lossy. Imagine a CXF JAXWS service written code-first, but using types
> generated from a schema that has an element M defined as a choice of two
> other elements A and B. That service will accept <M><A/><B/></M> and <M/>
> without error, even if it has validation enabled.
>
> <!-- foo.xsd -->
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
>            attributeFormDefault="unqualified"
>            elementFormDefault="qualified"
>            targetNamespace="http://foo.com";>
>   <xs:element name="M">
>     <xs:complexType>
>       <xs:choice>
>         <xs:element name="C" type="xs:string"/>
>         <xs:element name="D" type="xs:string"/>
>       </xs:choice>
>     </xs:complexType>
>   </xs:element>
> </xs:schema>
>
> <!-- HelloWorldImpl.java -->
> package demo.hw.server;
> import javax.jws.WebMethod;
> import javax.jws.WebParam;
> import javax.jws.WebService;
> import javax.jws.soap.SOAPBinding;
> import gen.M;
> @WebService(targetNamespace = HelloWorldImpl.NS_URI)
> @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
> public class HelloWorldImpl {
>     public static final String NS_URI = "http://foo.com";;
>     @WebMethod(operationName = "M")
>     public String processM(@WebParam(targetNamespace = NS_URI, name = "M")
> M m) { return "X";
>     }
> }
>
> I guess this is because the runtime does not have access to the source XSD.
> It only has access to the JAXB annotations on the M class, which merely say
> that A and B may be omitted (i.e, you cannot say "either A or B but not
> both must be present" using JAXB annotations). Thus, the set of validation
> rules implemented by JAXB/CXF is only a subset of the validation rules
> specified in the source XSD.
>
> But on closer inspection I discovered the 'location' attribute on the
> @XmlSchema annotation in package-info.java. This specifies the location of
> the original XSD. Unfortunately if I specify it in my package-info.java,
> the service generates WSDL that does not include any useful information
> about the schema:
>
> <wsdl:types>
>   <xsd:schema attributeFormDefault="unqualified"
>               elementFormDefault="qualified"
>               targetNamespace="http://foo.com";
>               xmlns:tns="http://foo.com";
>               xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>     <xsd:element name="M" nillable="true" />
>     <xsd:element name="MResponse" nillable="true" type="xsd:string" />
>   </xsd:schema>
> </wsdl:types>
>
> So...is it possible to get CXF to honour the 'location' attribute on
> @XmlSchema? Ideally it should consider it when returning the service's
> WSDL, but also consider it when validating incoming messages.
>
> - Chris

-- 
Daniel Kulp
[email protected]
http://www.dankulp.com/blog

Reply via email to