Seeing as there have been no answers, let me ask my question in a more 
open-ended way. I am looking for a way to provide RESTful services with a Camel 
endpoint. I will have two objects in my hierarchy: Person and Account. For each 
object I will need to support several methods (search, create, update, delete) 
with different parameters; these methods are mapped to URLs with the 
appropriate HTTP verb and URL path parameters. So, for example, I will have the 
following methods for Person:

  findPerson(id) => GET /person/{id}, XML response
  findAllPersons() => GET /person, XML response
  addPerson(data) => POST /person, XML body with person data
  updatePerson(data) => PUT /person, XML body with person data
  deletePerson(id) => DELETE /person/{id}

and the same sort of thing for Account.

Now, I want to do this by exposing exactly TWO Camel routes, one listening on 
"http://.../person"; and one listening on "http://.../account";. Each route 
should then forward the request to a Java class (one class for Person, one for 
Account). I would like the class for Person to be written like this (likewise 
for Account; annotation syntax was made up):

  @URL("/person")
  Class PersonBean {

    @Method("GET")
    @URL("/{id}")
    Person findPerson(@Param("id") int id) {
      Person person = getMeThatPerson(id);
      return person;  // magically mapped to an XML response body
    }

    @Method("GET")
    @URL("")
    List<Person> findAllPersons() {
      List<Person> list = getMeAllPersons();
      return list;  // magically mapped to an XML response body
    }

    @Method("POST")
    @URL("")
    Person createPerson(@Body Person person) {
      // magically map POST body to a Person object
      saveThisPerson(person);
      return person;  // magically mapped to an XML response body
    }

    @Method("PUT")
    @URL("")
    Person updatePerson(@Body Person person) {
      // magically map POST body to a Person object
      saveThisPerson(person);
      return person;  // magically mapped to an XML response body
    }

    @Method("DELETE")
    @URL("/{id}")
    void deletePerson(@Param("id") int id) {
      getRidOfThisPerson(id);
      return;
    }
  }

My questions are:

1. What kind of endpoint should I use for this? I would like it to be as 
lightweight as possible, so jetty, restlet or servlet seem preferable to CXF. I 
have done something similar to this with restlet, but I ended up configuring 
the HTTP verb in the route itself, which was not to my liking.

2. How do I specify the routes so that I can write my beans the way I 
described? I would rather map each method to the correct verb in my Java code, 
not in the route specification.

Thanks in advance and best regards.

-- 
DCV
Gonzalo Diethelm
Gerente Desarrollo de Sistemas / CDO
Apoquindo 4001 piso 12, Santiago, Chile
+56 2 393-9073
[email protected] / www.dcv.cl


> -----Original Message-----
> From: gonzalo diethelm [mailto:[email protected]]
> Sent: Monday, 16 May, 2011 18:46
> To: [email protected]
> Subject: RE: Service architecture
> 
> > So, my question is: is it possible to magically go from the Camel
> from("")
> > route definition to a Spring MVC implementation of the business logic?
> 
> Let me clarify my question a bit: I would love to be able to do this:
> 
>   from("INPUT:http://localhost:9080/account";)
>     .to("PROCESS://magic");
> 
> The meaning of this route would be:
> 
> 1. Register "http://localhost:9080/account/"; as the URL for a Camel
> endpoint. I have no idea what "INPUT" could be; I am guessing it might be
> "jetty" or "servlet".
> 
> 2. An hits on that URL or anything "hanging" from there should be
> forwarded to "magic", which is a Java class that implements the
> @Controller Spring annotation. I have no idea what "PROCESS" would be...
> 
> 3. This class is declared like this:
> 
>   @Controller
>   @RequestMapping("/account")
>   public class MagicController
>   {
>     @RequestMapping(value="/owners/{oid}", method=RequestMethod.GET)
>     public String findOwner(@PathVariable("oid") String oid,
>                             Model model)
>     { /*blah*/ }
> 
>     @RequestMapping(value="/{aid}", method=RequestMethod.POST)
>     public String createAccount(@PathVariable("aid") String aid,
>                                 Model model)
>     { /*blah*/ }
>   }
> 
> In other words, I would like to have a single Java class that handles all
> URLs hanging from the one my Camel route is defined for. And this class
> should be allowed to use Spring to access all things related to the
> request (URL path parameters, headers, cookies, body, etc.), using all the
> Spring goodness that has been created for these purposes.
> 
> > If I am talking nonsense, apologies in advance.
> 
> Ditto.
> 
> --
> Gonzalo Diethelm

Reply via email to