Martin,
Thank you for the feedback! Another alternative that was mentioned
earlier was Apache CXF. Apache CXF and
Enunciate have one thing in common - REST services are implemented in
Java. Some people prefer to work in Java, others prefer configuring
things in XML. I'm the latter.
Btw, I have created a Jira issue where the design is taking place. I
encourage anyone who is interested to check it out. I believe the
solution proposed there makes implementing REST services trivial, and no
Java coding is needed.
https://issues.apache.org/jira/browse/OFBIZ-4274
-Adrian
On 5/11/2011 7:40 AM, Martin Kreidenweis wrote:
Hi,
On 10.05.2011 13:07, Adrian Crum wrote:
After thinking about this for a while, I came to the conclusion that the REST
servlet should have
its own request config file. REST request elements will be kept in their own
config file and that
file will be specified in web.xml.
Why reinvent the wheel? We integrated Enunciate in OFBiz for our REST API. It
adheres to the REST
principles, is actually quite comfortable to use and was not hard to integrate
into OFBiz.
And it generates a nice documentation for the API from your JavaDoc. :)
Have a look at it here: http://enunciate.codehaus.org/getting_started.html
I'll paste some code snippets to get you started. Just ask if you need more
details.
Enunciate brings its own web app, which is actually generated.
So we put it in hot-deploy/api/build/web-app. We just added the webapp to
ofbiz-component.xml:
<webapp name="api" location="build/webapp/basic-app" mount-point="/api"
app-bar-display="false" ...
Then you have to integrate enunciate in the build process, the component's
build.xml should contain
something like that:
<!-- we put the enunciate libraries here: -->
<property name="enunciate.home" value="enunciate/enunciate-1.20" />
<property name="enunciate.config" value="config/enunciate.xml" />
<property name="build.main.dir" value="build/classes/basic-app" />
<property name="build.tmp.dir" value="build/tmp" />
<!-- override classes target to call enunciate -->
<target name="classes" description="enunciate specific build step"
depends="prepare">
<taskdef name="enunciate"
classname="org.codehaus.enunciate.main.EnunciateTask">
<classpath refid="enunciate.classpath" />
</taskdef>
<delete dir="${build.tmp.dir}" />
<mkdir dir="${build.tmp.dir}" />
<enunciate basedir="src/main" configFile="${enunciate.config}"
verbose="true"
scratchDir="${build.tmp.dir}" generateDir="build/gen-src"
compileDir="build/classes"
buildDir="build/webapp">
<include name="**/*.java" />
<classpath refid="enunciate.classpath" />
</enunciate>
<javac16/>
</target>
In the enunciate config file we configured enunciate not to do the actual build
itself, but let the
OFBiz build system do this:
<webapp doPackage="false" doLibCopy="false" doCompile="false"
mergeWebXML="merge-web.xml">
We also have a servlet filter for authorization configured.
And our Enunciate Services all inherit from a BaseService class which provides
the OFBiz delegator
and dispatcher:
protected Delegator delegator = DelegatorFactory.getDelegator("default");
protected LocalDispatcher dispatcher =
GenericDispatcher.getLocalDispatcher("api", delegator);
In the Enunciate methods we can then call OFBiz services with
dispatcher.runSync() and access the
OFBiz database using the usual Delegator.
So our mapping from OFBiz services to the REST paradigm is done in Java code,
no XML configuration
necessary here :-)
Regards
Martin