The validation code could in theory impose the schema as you ask, yes.
Care to make a patch?

On Mon, Feb 16, 2009 at 5:14 PM, Chris McClelland <[email protected]> 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
>
>

Reply via email to