Bengt, If you're creating the CXF endpoint in Spring you could use the following example:
1) <jaxws:endpoint 2) id="classImpl" 3) wsdlLocation="wsdl/helloService.wsdl" 4) implementor="org.apache.cxf.jaxws.service.Hello" 5) address="http://localhost:8080/test" Here you see on line 3 that the endpoint uses a concrete WSDL file bundled with your application rather then reconstructing a WSDL using the annotations on the SEI. Restrictions and regex patterns in the WSDL cannot be translated to annotations on your SEI, which is why the reconstructed WSDL does not contain them. The restrictions are lost in the transformation to and from JAX-WS and JAX-B. By packaging the original WSDL with your implementation the CXF endpoint can simply serve the original WSDL to clients that call the something?wsdl url, and use your supplied implementation (line 4) to handle the incoming messages. BTW, you can also enable schema validation on the endpoint. See http://cxf.apache.org/faq.html#FAQ-HowcanIturnonschemavalidationforjaxwsendpoint%3F Good luck! Geert Schuring. Links: http://cxf.apache.org/docs/jax-ws-configuration.html 2011/10/28 Bengt Rodehav <[email protected]> > Hello Geert. Thanks for your answer. > > We use wsdl2java to generate an interface (the SEI) that we then implement. > Sounds like the way you describe it. Is there an alternate way to do this > that will preserve the wsdl? Or is there an easy way to just intercept the > wsdl query and make sure that the original wsdl and xsd's are returned? > > /Bengt > > 2011/10/26 Geert Schuring <[email protected]> > > > Bengt, > > > > How do you create the CXF endpoint? The behaviour you describe is exactly > > what I would expect when you generate the SEI from a WSDL document and > then > > use the SEI to create a CXF endpoint. The SEI will contain JAX-B > annotated > > types and CXF will reconstruct the WSDL at runtime based on the JAX-WS > and > > JAX-B annotations on your interface and classes, instead of using the > WSDL > > you used at compile-time. > > > > Kind regards, > > Geert Schuring. > > > > 2011/10/3 Bengt Rodehav <[email protected]> > > > > > I've done some more testing. It seems like restrictions on strings that > > use > > > enumerations are preserved but that's really the only kind of "strict" > > > typing that seems to be preserved when querying the WSDL in runtime. > > Also, > > > the documentation is lost. > > > > > > Using this type definition > > > > > > <simpleType name="PositionType"> > > > <annotation> > > > <documentation> > > > L = Long (Innehavd/inlånad) > > > S = Short (Utfärdad/utlånad) > > > </documentation> > > > </annotation> > > > <restriction base="string"> > > > <enumeration value="L" /> > > > <enumeration value="S" /> > > > </restriction> > > > </simpleType> > > > > > > The enumeration is preserved but the documentation is lost. The below > > will > > > simply be transformed to a "xs:string" in the runtime wsdl - no length > > > information is preserved: > > > > > > <simpleType name="SecurityId"> > > > <restriction base="string"> > > > <minLength value="0"></minLength> > > > <maxLength value="12"></maxLength> > > > </restriction> > > > </simpleType> > > > > > > The below will be transformed to a "xs:decimal" without information > about > > > no > > > of digits and decimals: > > > > > > <simpleType name="SecurityCount"> > > > <restriction base="decimal"> > > > <totalDigits value="19" /> > > > <fractionDigits value="6" /> > > > </restriction> > > > </simpleType> > > > > > > > > > The following will be transformed into a "xs:int" without information > > about > > > maximum no of digits: > > > > > > <simpleType name="AccountId"> > > > <restriction base="nonNegativeInteger"> > > > <maxInclusive value="99999999" /> > > > </restriction> > > > </simpleType> > > > > > > I think this is serious. Ideally CXF should return the wsdl I started > out > > > with but containing the correct runtime bindings regarding e g address > > and > > > port. It seems to me that CXF extracts the information that it needs > for > > > itself and excludes the rest. But the wsdl query's purpose is not for > the > > > CXF server but for the clients. Clients could be implemented using any > > > technique which is why all available metadata should be provided. Also, > > > wsdl > > > is a perfect place for documentation but it's all removed. I don't > really > > > understand why CXF doesn't answer with the original wsdl when "wsdl > > first" > > > is used. > > > > > > /Bengt > > > > > > 2011/10/3 Bengt Rodehav <[email protected]> > > > > > > > I don't promise anything since we're pretty much under pressure here > > (as > > > > always I guess). But I'll try, > > > > > > > > /Bengt > > > > > > > > > > > > 2011/10/3 Daniel Kulp <[email protected]> > > > > > > > >> > > > >> Any chance you could file a test case? We do have some tests to > make > > > >> sure > > > >> the annotations and stuff are preserved. However, they may be for > > > >> external > > > >> xsd's, not schemas embedded in the wsdl. I'd have to dig in more > to > > > >> check > > > >> that, but a test case would be great. > > > >> > > > >> Dan > > > >> > > > >> > > > >> On Saturday, October 01, 2011 10:08:42 AM Bengt Rodehav wrote: > > > >> > Hello, > > > >> > > > > >> > We're using CXF 2.4.2 to provide a web service API to a legacy > > > >> application. > > > >> > We are in the process of increasing the quality of the API in a > > number > > > >> of > > > >> > ways. > > > >> > > > > >> > First, we are typing the interface more strictly. E g instead of > > > >> specifying > > > >> > that a value is a string, we say that it's exactly one character > > long > > > >> and > > > >> > also enumerate it's valid values. We also try to add documentation > > to > > > >> the > > > >> > WSDL. The following is a typical case: > > > >> > > > > >> > <xs:simpleType name="MyType"> > > > >> > <xs:annotation> > > > >> > <xs:documentation> > > > >> > A = ... > > > >> > B = ... > > > >> > C = ... > > > >> > </xs:documentation> > > > >> > </xs:annotation> > > > >> > <xs:restriction base="xs:string"> > > > >> > <xs:pattern value="A|B|C" /> > > > >> > </xs:restriction> > > > >> > </xs:simpleType> > > > >> > > > > >> > However, even if we feed the above WSDL to CXF (we use WSDL > first), > > in > > > >> > runtime when asking for the WSDL (using ...?wsdl), the above > > > information > > > >> is > > > >> > gone. The type is simply a string and the documentation is gone. > > > >> > > > > >> > Why is this? Is it a bug? What is best practice regarding strict > > > >> interfaces > > > >> > and documentation using CXF? > > > >> > > > > >> > /Bengt > > > >> -- > > > >> Daniel Kulp > > > >> [email protected] > > > >> http://dankulp.com/blog > > > >> Talend - http://www.talend.com > > > >> > > > > > > > > > > > > > >
