Absolutely. The CXF distribution contains an example called
"java_first_jaxws_factory_bean" that demonstrates the use of the Java API.
Below is an extract from that example:
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class Server {
protected Server() throws Exception {
System.out.println("Starting Server");
HelloWorldImpl implementor = new HelloWorldImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(HelloWorld.class);
svrFactory.setAddress("http://localhost:9000/helloWorld");
svrFactory.setServiceBean(implementor);
svrFactory.getInInterceptors().add(new LoggingInInterceptor());
svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
svrFactory.create();
}
Good luck!
Geert Schuring.
2011/10/28 Bengt Rodehav <[email protected]>
> Thanks a lot for you advice Geert,
>
> In general I'm moving away from Spring and try to minimize its use. I think
> it brings on it's own little world these days which I do not want. It might
> of course be an option if there is no other way. It seems like there must
> be
> a way to tell CXF what wsdl to return without using Spring but plain old
> java. Isn't there?
>
> /Bengt
>
>
>
> 2011/10/28 Geert Schuring <[email protected]>
>
> > 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
> > > > > >>
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>