2012-04-03 19 views
2

ich so das Gefühl ist ein häufiges Problem, aber nichts, was ich recherchiert habe noch gearbeitet hat ...RESTful-Servlet-URLs - Servlet-Mapping in web.xml

In meiner web.xml ich eine Zuordnung für alle REST haben nennt -

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

das funktioniert gut, wenn die URL -

GET /rest/people 

aber versagt wenn es

012 ist
GET /rest/people/1 

Ich bekomme einen 400 Bad Request Fehler, der The request sent by the client was syntactically incorrect() sagt. Ich bin mir nicht sicher, dass es sogar für die Frühjahrstagung des Servlet gemacht geroutet ...

Wie kann ich Wildcard etwas, die mit /rest beginnen, so dass es angemessen gehandhabt werden kann?

Mit anderen Worten, die ich für alle folgenden möchten gültig sein -

GET /rest/people 
GET /rest/people/1 
GET /rest/people/1/phones 
GET /rest/people/1/phones/23 

bearbeiten - Code-Controller wie gewünscht

@Controller 
@RequestMapping("/people") 
public class PeopleController { 

    @RequestMapping(method=RequestMethod.GET) 
    public @ResponseBody String getPeople() { 
     return GsonFactory.getInstance().toJson(LookupDao.getInstance().getPeople()); 
    } 

    @RequestMapping(value="{id}", method=RequestMethod.GET) 
    public @ResponseBody String getPerson(@PathVariable String id) { 
     return GsonFactory.getInstance().toJson(LookupDao.getInstance().getPerson(id)); 
    } 
} 

Antwort

@matsev Es schien mir egal zu sein, ob ich die / dort hatte oder nicht.

Während ich die Variablennamen für die öffentliche Ansicht transponierte, habe ich ein paar Dinge geändert, damit es funktioniert.

Original-

@RequestMapping(value="{id}", method=RequestMethod.GET) 
public @ResponseBody String getPerson(@PathVariable String userId) { 
    return GsonFactory.getInstance().toJson(LookupDao.getInstance().getPerson(userId)); 
} 

Was habe ich geschrieben

@RequestMapping(value="{id}", method=RequestMethod.GET) 
public @ResponseBody String getPerson(@PathVariable String id) { 
    return GsonFactory.getInstance().toJson(LookupDao.getInstance().getPerson(id)); 
} 

Der Variablenname Mismatch mir angetan hat in ... ich dies hier lassen als Warnung an alle ... Match Deine Variablennamen!

+0

Können Sie Ihren Controller-Code veröffentlichen? Meine Vermutung ist, dass Sie nur '/ people' und nicht'/people/{id} 'zugeordnet haben. – matsev

+0

@matsev Ich habe den Code für Sie veröffentlicht. Danke, dass Sie es überprüft haben. –

+0

Zuordnung in web.xml ist in Ordnung. Kannst du hier den Code der Controller-Klasse method() für/rest/people/1 einfügen? Vielleicht kann ich helfen. – shashankaholic

Antwort

4

versuchen, ein / vor dem {id} hinzufügen:

@RequestMapping(value="/{id}", method=RequestMethod.GET) 

Ohne sie wird die ID direkt an den Menschen URL angehängt werden, z /rest/people1 zu /rest/people/1 gegenüber.