About wsimport vs wsld2java for SOAP request client - web-services

I've just generated the java source files to build a Web Service client, using the wsimport of jdk1.7.
wsimport -keep /path/to/wsdl
For make the SOAP request I used the clasess under generated folder. Everything went ok, with a response 200 :)
But then, I wanted to use (for ... 'fun') CXF (v.2.7) wsdl2java tool to make exactly the same, but using this tool it doesn't generate the classes needed for the SOAP Request, it doesn't create the generated folder either.
wsdl2java -keep -verbose /path/to/wsdl
Also I notice that the class ObjectFactory that the tools create by its own, are different. Using wsdl2java creates a much short file.
So, why are those tools generating different results ??
I dont clearly understand the difference about this two, can u help me ??
The wsdl used is importing xsd files, that have a well-know problem, which I've resolved thanks to this blog entry
here
Thanks for your answer

Related

What is the difference between ?wsdl and ?singleWsdl parameters

My messaging provider gives me two different kinds of WSDLs to use.
http://my.amazonaws.com:8000/webservice/?wsdl
http://my.amazonaws.com:8000/webservice/?singleWsdl
The first one is an embedded WSDL. Can NOT use it to generate WSDL2java packages and
can NOT use JAX-WS to create a connection.
The second one is a single WSDL. It can generate Java packages with CXF 3.0's WSDL2java and can use JAX-WS to create a connection. It works very well.
Please let me know what is the difference between these two kinds of WSDLs.
Without knowing what those links return we can only guess, but here are some details that might help you....
Suffixing the web service endpoint with ?wsdl get's you a WSDL file. The WSDL can be generated by the framework at runtime based on the web service skeleton code or can be an actual physical file that the server just sends back when the URL parameter is specified.
The WSDL contains an XML Schema that can be specified either inside the WSDL itself or as separate files that are imported by the WSDL. And now a problem occurs...
Some web service stub generators can only handle a full WSDL, with the Schema inside. If the WSDL imports other files the tools can't resolve the imports and fails. This made web services hard to consume because clients had issues creating stubs to interact with the web service. So much so that service providers either used an actual WSDL to respond to the ?wsdl request or started writing all sorts of hacks and plugins to make the web service generate the full WSDL.
But some providers didn't even bother so clients had to write the hacks to parse the WSDL or they had to download all files, assemble them manually into a single file and use that instead.
With time people recognized this as a problem and frameworks adapted to provide the full WSDL, not one with imports. But this generated another problem. Changing what the ?wsdl URL returned could break all those hacks created around it to fix the import problem. For this reason another convention was chosen to return the full WSDL: ?singleWsdl.
So there are frameworks that generate a full WSDL, some that generate it with imports, some allow you to specify an actual physical file, some that support the ?singleWsdl convention, some that don't. Not relevant to this question, but just for completion, there is also a ?wsdl2 convention that get's you a WSDL 2.0 definition (?wsdl get you a WSDL 1.1). Some frameworks support ?wsdl2, some don't.
My guess is the issues you have are caused by Schema imports, but without the WSDLs themselves I can't tell. Hope at least that these details help you better identify the problem.

What does wsimport do with jax-ws-catalog.xml?

All of the documentation I've found online about wsimport seems to be a little vague about one aspect of using a catalog file (jax-ws-catalog.xml). My question is:
When I generate a web service client using wsimport and the -catalog option, does wsimport only use my catalog during build time in order to find the WSDL it's using to create the web service? Or does it also somehow bundle the catalog into the generated web service so that the catalog can be used to locate resources during run time?
I'm guessing that wsimport only uses the catalog file to resolve resources during build time, and that if I want to use a catalog file to resolve resources at run time, that I have to bundle jax-ws-catalog.xml with my web client, but again, the documentation I've found so far seems a bit unclear, I'd prefer to hear this confirmed explicitly by someone who knows better.
UPDATE: I'm using a Maven plugin to generate my web service classes (http://mojo.codehaus.org/jaxws-maven-plugin/wsimport-mojo.html).
Let me know if anything in this question is unclear and I'll edit to add more information.
#dbisdorf --> yes , when you use -catalog option the with *catalog.xml file , that file is copied over to the WEB-INF or META-INF dir of the Java EE project. This will be used to lookup refernece # Runtine .If you don't wish to use it you should specify genRuntimeCatalog=false.
This is clearly documented in the following link : http://docs.oracle.com/cd/E13222_01/wls/docs103/webserv_adv/xml.html

Have WSDL, need to generate services (step by step instructions)

Any documentation on creating a service and deploy to JBoss from WSDL? I have found several on the net, struggling to choose the correct/optimal approach. Using spring is also okay.
I have created WSDL from eclipse based on my requirements. Now, How do i generate request/response from WSDL? and then stubs. I also can use Intellij if it simplifies things.
I did generate a service, but i had to strip out so many jar files (jboss related) from my ear file before deploying to make it work. Any help generating ear file will be helpful too.
JDK 1.6; JBoss 5.1; Eclipse Indigo or Intellij Idea (11.1.4)
I know this question has been asked several times, but as i mentioned tons of information on the web, getting confused with several approaches.
If you are using Maven, you can use the jaxws-maven-plugin to generate artifacts. You can find a simple maven project for generating artifacts from a WSDL, here (wsimport)
Step-by-step:
Generate Java artifacts from your WSDL. (Use wsimport tool or Maven plugin)
Implement the generated Service Endpoint Interface.
Deploy.
If you want to start with Spring-WS, the obvious starting point is the documentation. You probably want to use a marshalling framework like JAXB to generate classes based on your WSDL. Based on those classes you can create #Endpoint annotated classes. In such an endpoint, you can create methods which are annotated with #PayloadRoot and #RequestPayLoad - based on that combination it will be mapped to a specific operation in the WSDL. Check out this page in the documentation for more information on annotating methods.

How to use CXF with SDO?

I try to build a CXF-based client application for an existing web-service using 'Contract-First' pattern.
The XSDs are quite complex so I am looking for a way to utilize something like SDO, avoiding code-generation for a WSDL. WSDL2Java tool makes 20K-line classes.
I have already used SDO in IBM WebSphere ESB, I wish I could reuse my previous code.
I can't find a way of doing this with CXF,
only this: http://cxf.apache.org/docs/sdo.html.
The text regarding SDO seems to be outdated because WSDL2Java tool does not support a "-db sdo" parameter anymore.
It says:
WSDL2Java -o D:/wsdl2java_out -d sdo -uri WS.wsdl
...
Caused by: org.apache.axis2.wsdl.codegen.CodeGenerationException: No proper databinding has taken place
You are using the Axis2 wsdl2java command and not the CXF wsdl2java.

Generate WSDL for existing SOAP Service using captured traffic

I need to use the SOAP service of a printer. There is a windows tool to access this service and I used it to generate SOAP requests and responses of the important functions that I need.
Now I should write a client for Linux using Python and I found the easiest way would be to use the suds library with an WSDL file. But I don't have this WSDL!
As I investigated the windows tool (looked at the hexdump of the executables), I came to the conclusion that there probably is no WSDL file at all.
Now my question is, has anybody experience with "reverse engineering" SOAP services and knows tools which could be useful for creating WSDL files for existing services? (Googleing hasn't brought up anything useful yet).
You mentioned this is the SOAP service of a printer. Is the printer's API documented on the manufacturer's site? Does the documentation include the WSDL? Can you get the WSDL from the manufacturer?
If you can get the WSDL from the manufacturer then you're done!
If not, then you have to build the WSDL by yourself because I doubt you can find a tool that generates WSDLs given SOAP samples (when working with SOAP web services you mainly get two kinds of tools: those that generate code from WSDL + those that generate WSDL from code).
It's not hard to create the WSDL if you are familiar with SOAP, WSDL and XSD. You just need a text editor or maybe even a WSDL editor to speed things up.
If you don't have full confidence in your WSDL knowledge, there are still some tools that can get you most of the way to the complete WSDL. Here is a way you could do it:
1 - First you need to create the XML schema for the SOAP payloads. For this you can find tools, even some online. After you have the schema, tweak it to your needs by adding, changing or removing elements.
2 - Now you can use the XSD to generate a WSDL. There is an online tool that does that. It just needs the request/response element types to end with Request/Response. Make sure you read the instructions.
You take your XSD file, change the names of the operations to add the Request/Response suffix and feed it to the WSDL Generator - Web Tool. You will get your WSDL.
Now tweak this WSDL as you like (remove the Request/Response suffixes if you don't need them) then ...
3 - ... make sure you end up with a valid WSDL.
4 - Now you can take your WSDL and use a tool like SoapUI to generate sample requests and responses from it just to verify that you get the proper results back.
Do the SoapUI messages match the messages you started with? If yes, you are done and can feed the WSDL to suds to create the Linux client. If not, tweak the WSDL until you get the result you are after.