When implementing Web services, there are two alternative
development paths you can take: the code-first approach and
the contract-first approach. This article drills down into
the contract-first approach in detail and shows how the Axis2 code generator can be used
to generate code for the server side with the contract-first
approach.
Why Not Code First?
Usually when developing Web services, developers like to code
the business logic first and then expose that logic as a Web service.
This is convenient because developers' core competency is the particular programming language they use. It also happens to be much
more convenient for exposing existing programs as Web services.
However, the code-first approach has several drawbacks.
The developer has less control over the process of exposing
code as services. A change to the code may mean a regeneration of
the publicly visible Web services interfaces, and often it is
difficult to agree on such a generated interface from a business
perspective. The client programs often are generated using the
service's WSDL file; if the service WSDL file is likely to
change, then the point of having generated clients becomes less
obvious.
The code for the service process is likely to change between
service frameworks and even framework versions, and it becomes
difficult to maintain a single interface across versions.
It is true that by using annotations the impact of some of these
issues can be lessened. Annotations help the developer take
control of the process of exposing code. However, there is no such
thing as a generic annotation scheme to make it universally
applicable over multiple languages and multiple frameworks!
"Contract First" - What is So Special About It?
As opposed to code first, the contract-first approach takes the
contract as the primary artifact. The "contract" in a Web
service interaction obviously is the WSDL document; therefore, in the
contract-first approach, the focus is on creating the WSDL file and
the associated XML schema. The WSDL file and the schema clearly
define the message formats, the operation and interface names, and
other relevant information for a complete Web service interaction,
and can be agreed on by multiple parties. Almost all major Web
service frameworks allow service generation from WSDLs, and it
becomes easier for the service implementer too; because the major
portion of the code is generated, only the necessary business logic
would need to be filled in.
It should be noted that the contract-first approach has its own
problems, the most notable one being the need for WSDL and
schema expertise. One can argue whether the Web service
implementers would need to do anything with WSDL since the primary
requirement of the WSDL is in providing a description of the
service rather than providing the service itself. This would have been a
major problem in earlier times, but now some very good visual
tools are available, both free and commercial, allowing easy construction of
WSDLs. The Resources section provides links to
one such free WSDL editor.
The next section of this article shows how to utilize Axis2 to
build Web service implementations with a contract-first
approach.
Axis2 Code-Generation Tool
The Apache Axis2 project comes bundled with a new code-generator tool. This code generator allows multiple data-binding frameworks to be incorporated and is easily extendable.
In its simplest form, the code generator is a command-line tool.
It also comes in other flavors like the Eclipse/IDEA plug-in or the
custom ant task. However, these use the same tool
core to generate code and the options available are the same. All
the examples in this article use the command-line tool, but the
graphical equivalent is easy to figure out and can be used
appropriately.
The batch/shell scripts for the code-generator tool are
available in the bin directory of the
Axis2 standard binary distribution (ZIP, 10.3 MB). Usually,
once the standard Axis2 distribution is downloaded and unzipped,
the scripts are ready for action. If you are having problems
running the tools, the Axis2 site has a great deal of documentation
for how to install Axis2, set up the classpath, and more.
A Word About the Axis2 Service Deployment Model
The Axis2 service deployment model is drastically different from
the older deployment models, and is worth mentioning before diving
down into the details. The primary concept of Axis2 is the
aar file, which is an archive file that contains all the
artifacts required by the service. (AAR stands for
Axis2 ARchive.) The content of
the aar file has the structure shown in Figure 1.
Figure 1. Structure of an AAR file
The services.xml that goes inside the META-INF
directory is the primary controller of the service. It specifies
the artifacts to load and the parameters for each artifact. More
information about aar files can be found on the Axis2 Web
site, and the Resources section includes
links to more information about the Axis2 deployment mechanism.
Enough said. It is time to dig in!
First Round - Use the Default Options
To generate server-side code from a WSDL, you have to provide the
-ss (short for --server-side) and
-sd (--service-descriptor) flags to the
code generator. Really it is the -ss flag that
determines whether it is server-side code, but it is recommended
that the -sd flag also be used with the
-ss flag, since the service cannot be deployed without
a service descriptor.
The following command generates server-side code with default
options:
> WSDL2Java -uri currencyConvert.wsdl -ss -sd
Since no output location has been specified, the output will be
directed to the current directory. The default data binding
mechanism is ADB (Axis
Data Binding).
Three artifacts will be visible immediately after the code
generation:
build.xml
src directory
resources directory
Inside the src directory, the source files will be
available inside the org/apache/axis2 directory since it
takes the default package when not specified. The most interesting
item here is the generated skeleton. This skeleton is meant for the
service implementer to be filled in and is the only piece
of code that would need to be modified to have a successful
service.
The resources directory will contain two files: the WSDL
file for the service and the services.xml file. These files
need to go into the META-INF directory of the aar file. The
skeleton will be named CurrencyConverterServiceSkeleton to
match the service name. For each operation in the
WSDL a corresponding method will be generated in the skeleton
class.
The following code snippet shows an example implementation of
the skeleton:
com.examplewebservice.www.types.ConversionResponse res = new
com.examplewebservice.www.types.ConversionResponse();
//do a proper calculation here
//right now we pick an arbitrary number to multiply with
res.setAmount(param0.getAmount()*102.32f);
return res;
Note that this code goes inside the skeleton
method.
Once the skeleton is implemented, the recommended way to
generate the service archive is to use the Ant build file. While it
is certainly possible to do the archive creation manually, the Ant
build is very convenient and saves developers a lot of trouble.
Run the Ant build file by typing ant. Note
that you have to have the AXIS2_HOME environment
variable set to point to the Axis2 installation location for the
Ant build to succeed:
> ant
After a successful build, one more directory will be
generated named build. The build directory contains a
lib directory that contains the generated aar file.
As a quick way of testing the service, the archive can be
uploaded to one of the open WSO2 Tungsten servers available
at tools.wso2.net.
WSO2 Tungsten is a bundled version of Axis2, and Axis2 aar files
are fully compatible with WSO2 Tungsten.
Second Round - Use a Different Databinding
Axis2 allows use of different data-binding frameworks for code
generation, and for this round we'll try to use XMLBeans.
The following command generates server-side code, using XMLbeans
for the databinding. Note that the earlier generated artifacts (if
they are still there) need to be manually removed, since the code
generator does not overwrite existing files:
The immediately noticeable changes among the artifacts is the
presence of some more files in the resources and src
directories. In this case, the XMLBeans-specific binary file set
(with the extension xsb) will be available in the
resources directory.
The skeleton is very similar to the one in case 1, except
it has XMLBeans-specific classes in the skeleton rather than the
ADB classes. The following code snippet shows how the skeleton can
be filled using XMLBeans data-bound classes:
com.examplewebservice.www.types.ConversionResponseDocument res =
com.examplewebservice.www.types.ConversionResponseDocument.
Factory.newInstance();
//do a proper calculation here
//right now we pick an arbitrary number to multiply with
res.setAmount(param0.getAmount()*102.32f);
return res;
You can see that the skeletons have a strong resemblance to
each other even though the underlying databinding mechanism has
changed completely. All the issues related to databinding are
handled under the hood, and the service implementation would not
need to worry about anything other than filling in the business
logic.
The importance of using the Ant build file for making the aar
file becomes clear when using XMLBeans. The XMLBeans databound
classes do require the .xsb files to be in the classpath, and
the generated Ant build comes with targets that copy these
non-class files to the appropriate locations.
Third Round - Generate an Interface Instead of a Concrete
Class
A common (and reasonable) requirement of the service developers
is to have an interface for the skeleton and then name a particular
service implementation for the configuration. This can easily be
done with Axis2 by using the -ssi (server-side
interface) flag:
This code causes the emitter to emit an interface in place of a
concrete class. Of course, the concrete class is also generated,
but it is not referred to inside the message receiver. Instead, the
interface is used, and the user is free to place any class that
implements that interface as the service class.
One other interesting tweak to the code generation is generating
both server-side and client-side code in a single shot. This can be
achieved using the -g flag. The generated code will contain
both the skeleton and the stub and will be of use when code
generating everything at once!
The code generator provides a number of options for tweaking the
generated code, and the complete reference is available
on the Axis2 site.
Conclusion
The contract-first approach is the better way to go when it
comes to implementing Web services. Fortunately, Axis2 has a
flexible code generator that supports first-hand contract-first
development.
Resources
Eclipse WTP - a
tool that allows easy WSDL creation
problem running the example code
2006-10-17 00:43:55 moizghori
[Reply | View]
Hi, I am trying to run the example code but I am getting the following error when I am running the Client. The web service deployed successfully on Axis2 using XMLBeans databinding. Does anyone know What am I doing wrong?
===============================================================
Cleint Code is following:
CurrencyConverterServiceStub stub = new CurrencyConverterServiceStub();
ConversionRequestDocument.ConversionRequest request = ConversionRequestDocument.ConversionRequest.Factory.newInstance();
//fill up the request object
request.setAmount(100f);
request.setFromCurrency("USD");
request.setToCurrency("SLR");
log4j:WARN No appenders could be found for logger (org.apache.axiom.om.impl.builder.StAXOMBuilder).
log4j:WARN Please initialize the log4j system properly.
org.apache.axis2.AxisFault: Data binding error
at org.apache.axis2.description.OutInAxisOperationClient.execute(OutInAxisOperation.java:287)
at org.apache.axis2.CurrencyConverterServiceStub.convert(CurrencyConverterServiceStub.java:133)
at Client.ConverterClient.main(ConverterClient.java:31)
Caused by: java.lang.Exception: org.apache.axis2.AxisFault: Data binding error; nested exception is:
java.lang.RuntimeException: Data binding error
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:318)
at org.apache.axis2.CurrencyConverterServiceMessageReceiverInOut.invokeBusinessLogic(CurrencyConverterServiceMessageReceiverInOut.java:66)
at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.receive(AbstractInOutSyncMessageReceiver.java:37)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:454)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:284)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:136)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.lang.RuntimeException: Data binding error
at org.apache.axis2.CurrencyConverterServiceMessageReceiverInOut.fromOM(CurrencyConverterServiceMessageReceiverInOut.java:146)
at org.apache.axis2.CurrencyConverterServiceMessageReceiverInOut.invokeBusinessLogic(CurrencyConverterServiceMessageReceiverInOut.java:50)
... 30 more
Caused by: java.lang.NullPointerException
at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3041)
at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3058)
at org.apache.xmlbeans.impl.store.Locale.doNamespaces(Locale.java:900)
at org.apache.xmlbeans.impl.store.Locale.loadXMLStreamReader(Locale.java:1135)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:843)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:826)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:231)
at com.examplewebservice.www.types.ConversionRequestDocument$Factory.parse(ConversionRequestDocument.java:173)
at org.apache.axis2.CurrencyConverterServiceMessageReceiverInOut.fromOM(CurrencyConverterServiceMessageReceiverInOut.java:136)
... 31 more
at org.apache.axis2.AxisFault.<init>(AxisFault.java:159)
... 3 more
Exception in thread "main"
2) Another point I want to add is when I deployed the service using ADB is working fine for Synchronous Client.
But Asynchronous client callback handler is not getting invoked thus not producing any output on console.
//Async not working NO RESPONCE
CurrencyConverterServiceStub stub =
new CurrencyConverterServiceStub();
ConversionRequest request = new ConversionRequest();
//fill up the request object
request.setAmount(100f);
request.setFromCurrency("USD");
request.setToCurrency("SLR");
//implement the callback
CurrencyConverterServiceCallbackHandler callback = new CurrencyConverterServiceCallbackHandler(null){
public void receiveResultconvert(ConversionResponse param1){
System.out.println("Converted amount is " +param1.getAmount() +" SLR");
}
};
//call the method
stub.startconvert(request,callback);
}
Any Help will be appreciated
Thanks
What about version 2 of the service?
2006-09-04 02:09:27 mulkers
[Reply | View]
I have 3 remarks:
1) I think Contract first is the only valid approach. If both the service consumer and the service providers are in Java, then why using WSDL? Just use the java interface as the contract and use RMI.
2) the WSDL is not the contract, it is part of the contract. The contract might include SLA or special policies applied by the service in this paricular context.
3) Generation of code is fine for the first version of the service interface. But if you think about implementing a second version of the service interface and then a third version, and still keeping a single implementation. Most of the frameworks which are generating code based on the WSDL will be inadequate. The best solution over time will be the one which allow you to configure your mapping between the XML messages and your Value (or Domain) Object models.
For example, a combined Axis/JiBX solution would be perfect or Oracle J2EE App.Server/Toplink OX. Configurable mapping is key if you want your application to support changes over time. Robin
Both are contracts
2006-09-01 01:43:38 nponte
[Reply | View]
The problem in discussing code-first vs. contract-first is that... well, everybody is right at some point of the discussion because bothe are contracts... but one is more that another.
In fact, the "Interface" artifact on programming languages (wether it is Java, .NET, C++) are meant to be "contracts". But, this contract only tie you on that specific language interoperability context. When you move to an XML interoperability context, the contract is in fact the WSDL because it is language agnostic.
Back to the old CORBA times (which can be understood as the binary equivalent of a web service), the contract was the IDL, not the Java interface.
Now trying to be honest and pragmatic, the people who design the "contract" is usually the Java/.NET/etc. team which is much more fluent in its language than the too-much-verbose WSDL. Besides, the experience shows that the "contract" is usually subject to "tweaks", especially when you are reaching the deadline... ;-)
Conclusion: in order to keep your project on rails, you just have to fit to the project requirements and start developing your web service instead of discussing what is the theoretical best practice... ;-)
I disagree
2006-08-14 06:34:37 atr0x
[Reply | View]
Contract first is not the right approach. As the author notes a Java developers core competency and expertise is with, well, Java. Not with XML or WSDL or XSD, etc.
A simple set of Java interfaces, "code first" can be the "contract".
The reasons the author notes as drawbacks to "code first" are also easily refuted.
"Less control" I simply disagree with. The interfaces, once agreed upon, should not change and need not be "generated", the resulting WSDL and or schema can be generated but the interface does not have to be. If the interface does need to change then any "contract" would also need to change under the very same circumstances.
Coupling to "frameworks" can be an issue, agreed, but it is easily avoided. You can create a very simple set of web service interfaces to be used as a "core" with any web service project in your organization which then is easily implemented in a "plugin" style architechture. This way each actual web service project is only tied to the "core" and is NOT coupled to a particular underlying "web service" framework such as Axis or Xfire. Using such simple OO programming techniques (which we all should be using anyway, decoupling things where possible) the "issue" of "maintain a single interface across versions" evaporates, it is a single version. (Using this approach you can literally switch from Axis to JAX-WS or Xfire to comeCommercialSOAPImpl, etc, without the interface OR the "code first" code that makes up your service being affected AT ALL.)
Contract first is not smart, unless your expertise is Schema and WSDL. On the contrary, if your expertise is a programming language, Java or anything else, then you should utilize that expertise and this article has not presented any compelling reason not to.
I disagree
2006-08-14 08:18:34 ajithranabahu
[Reply | View]
I suppose this is one of the most talked about areas in developing a web sercvice, whether to use the code first or contract first. However what you have to rememebr is that all web service developers do not use Java ! There are tons of other ways to implement a webservice and essentially there is no way that you can enforce uniformity among all these programming languages except declaring the WSDL. So in a business perspective what is worth agreeing upon is the WSDL, not the Java interface.
The Axis2 community understands the need for code first developement too, you can expose a class as a web service and there is on going work that aims to add annotation support. However the more extensible and enterprise friendly way is to use the WSDL first.
As I said in an earlier comment also, my intention in this article is demostrating the Axis2 contract first capabilities, not the contrast between code first and contract first.
I disagree
2006-08-14 11:04:46 atr0x
[Reply | View]
Of course all web service developers do not use Java? Those that have competencies in other areas should use those areas to develop, similarly. The Java EE 5 annotation support allows you to be quite specific in Java code (as you can be starting from the WSDL, and if you are a java developer (as I stated) then it makes much more sense to rely on your expertise.
And of course the WSDL is how you agree upon uniformity across the enterprise? However that has nothing to do with how you implement the service. The interoperability of the service, and the point of services in general, is the "agnostic" standards based description of the service and protocol (SOAP/Schema/WSDL). The resulting WSDL will not be different if you start from code than if you start from the WSDL itself? If it were then *that* might be a valid point to start from contract. (Saying WSDL is the "business perspective" agreed upon interface is not a reason, that is obviously the goal either way.)
I understand your statement that your intention in the article was to demonstrate Axis2 capabilities, and I respect that, the article does that well. But the article also itself debates the code first versus contract first approaches so a response in that arena should not be completely unexpected.
The more extensible and enterprise friendly way is to use what suits your organization better, if you are Java competent that is likely Java. The end result which will be exposed to the "enterprise" will be implementation agnostic and users/clients will have no idea what language is even involved.
I disagree
2006-08-16 20:27:49 ajithranabahu
[Reply | View]
Apologies for the delayed post.
It seems to me that you are partly in agreement with the fact that WSDL should be the business contract ? After you agree on a WSDL and then start implementing are you suggesting a 'meet in the middle approach' where you try to generate the exact WSDL by adding annotations to the code rather than starting from the WSDL ? IMHO that is somewhat impractical - mainly because annotations may not be rich enough to completely take over the control of the schema generation process. Also it is not going to work across multiple languages and multiple frameworks!
There is one very valid point about schemas though. If the schema is overly complex and employs every legal but not-so-elegant construct, then the generated code also will be difficult to handle,specially if the code is in an object oriented language and data bound. This is an identified problem and there is already a W3C spec group working on it. What they try to accomplish is to come up with a set of recommendations to schema writers that will give better data binding experience.
a WSDL2Java GUI..
2006-08-10 16:24:21 omatzura
[Reply | View]
is available in soapui (http://www.soapui.org), which makes contract-first development and testing even easier..
a WSDL2Java GUI..
2006-08-11 09:16:24 ajithranabahu
[Reply | View]
Yes. SOAPUI is a very good tool in this respect
Axis2 versus JEE5?
2006-08-09 14:36:43 jvmoyer
[Reply | View]
Contract-first is definitely the right approach. The article clearly explains how to do this with Axis2. Now... how do you go about accomplishing this with JEE5?
Axis2 versus JEE5?
2006-08-14 06:38:10 atr0x
[Reply | View]
Java EE5 comes with web service annotation support so that Java developers can start from "code first" and not worry about the service impl (underplying SOAP, etc) details. I realize this is not an answer to your question but I just wanted to point out that Java EE 5 went the other direction, code first.
Axis2 versus JEE5?
2006-08-14 10:10:47 jvmoyer
[Reply | View]
As java developers, we think the contract is described by the java interface. But web services are language agnostic. We need to think beyond Java and Java interfaces. In web services the contract is described by the WSDL. Your services users could care less whether you implemented your web service using Axis, or Axis2, or JEE, or Xfire, etc.; your users only care about the WSDL.
Now lets suppose you generated your WSDL using a Java-to-WSDL technology, such as Axis Java-toWSDL. Some months later you decide you want to convert to JEE with annotations. Will the generated WSDL be the same? Not likely. Is there any guarantee that one Java-to-WSDL tool will generate the same WSDL that another tool uses? No, there is no such guarantee. So when you publish your new WSDL, you may break all your users code. Your users are directly impacted by your implementation, and that is a bad thing.
Another practical issue is use of existing schemas. There are tons of XML schemas developed by various industry groups, and when appropriate, it makes sense to use of these schemas. But if all the tooling is only Java-toWsdl, what are you going to do?
The tools need to go beyond Java-to-Wsdl, to support WSDL to Java, or a meet in the middle approach.
Axis2 versus JEE5?
2006-08-14 11:36:43 atr0x
[Reply | View]
I agree with the two main points of your post. Those are valid points and potential problems of "code first" approach. However, I think these risks can be mitigated (each one is a debate in and of itself, WSDL generation being different and schema usage outside of WSDL) and I think the benefits of using the technology or programming language where your expertise lies outweighs the risks (and not doing so, "contract first" has its own risks which are greater in my experience).
I did not mean to start a big debate here I just do no agree that "contract first" is the better way. Both ways can work and generally *both* rely on some generation step (WSDL into Java stubs or Java into WSDL) which can be problematic.
Axis2 versus JEE5?
2006-08-14 11:01:49 kebernet
[Reply | View]
As java developers, we think the contract is described by the java interface. But web services are language agnostic. We need to think beyond Java and Java interfaces. In web services the contract is described by the WSDL. Your services users could care less whether you implemented your web service using Axis, or Axis2, or JEE, or Xfire, etc.; your users only care about the WSDL.
Wy, exactly, do we "need" to think beyond Java interfaces? If, as is the case, with the JAX-WS and JAX-B annotations you can have the same level of specificity in your Java interfaces that you can have in WSDL, and those interfaces are correctly turned into workable WSDL, what is the difference if I write the "contract" in Java or in WSDL?
Moreover, working in WSDL -- or more specificially Schema -- tends to be a recipe for shooting youself in the foot. When overly "thinking" in XML, it is WAY WAY too easy to use XML idioms that are not or are poorly supporing in Java, C#, or any of the other OOP languages that clients will be attempting to use with your service. If you start from Java, that is almost assuredly a non issue.
Reuse of existing schemas is a good idea, but I don't see how it is necessarily precluded by any of this, though. That is just an object model that can easily be imported into your project as a one-way import because they implicitly WONT change.
The tools need to go beyond Java-to-Wsdl, to support WSDL to Java, or a meet in the middle approach.
I think the JAX-B/JAX-WS annotations are EXACTLY that meet in the middle approach. They let you have all the additional specificity from Schema without having to work with a PITA one-way code generation system. Moreover, since they are standard, you can easily switch between Glasshfish, Xfire and the plain old Mustang JRE.
Axis2 versus JEE5?
2006-08-18 06:04:50 jvmoyer
[Reply | View]
Thanks for you thoughts. I think Ajith has done a good job of addressing these issues in his response to the thread, "I disagree", above.
What about the contract?
2006-08-09 01:50:57 sapporo
[Reply | View]
It's funny that the contract itself is hardly mentioned.
What about the contract?
2006-08-09 12:29:52 ajithranabahu
[Reply | View]
my intention in this article is to explain the Axis2 support for contract first development and not to elaborate on the contract itself. I've used the first two paragraphs to explain the contrat first apporoach in general just to make it clear for the readers of what we are doing here