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

Reply via email to