Hi Francesco, > Basically, strict matching is used, but the caller (the integration test > case) must explicitly appending ".json": in this way the latest part of > matching string is stripped, but input is now correctly provided. > > WDYT?
Yes, this does the trick. I'll commit a fix based around your patch shortly. Thanks, Colm. 2012/4/14 Francesco Chicchiriccò <[email protected]>: > On 13/04/2012 18:47, Colm O hEigeartaigh wrote: >> >> Hi Francesco, >> >> I've tried to go the reg-exp route, e.g.: >> >> @RequestMapping(method = RequestMethod.GET, value = >> "/deleteByUsername/{username:.*}") >> public UserTO delete(@PathVariable final String username) >> >> The username String gets picked up correctly >> ("[email protected]"). However, I see another error in the >> logs: >> >> SEVERE: Servlet.service() for servlet [syncope-core-rest] in context >> with path [/syncope] threw exception [Could not resolve view with name >> 'user/deleteByUsername/delete.by.username@apache' in servlet with name >> 'syncope-core-rest'] with root cause >> javax.servlet.ServletException: Could not resolve view with name >> 'user/deleteByUsername/delete.by.username@apache' in servlet with name >> 'syncope-core-rest' >> >> Any ideas? > > > It seems that: > > * when the REST method is annotated with strict matching (i.e. > "/deleteByUsername/{username}"), then Spring will strip off latest part of > {username} (after last '.'); this will result in an incorrect input > ("delete.by.username@apache") > > * when the REST method is annotated with extended matching (i.e. > "/deleteByUsername/{username:.*}"), then input is correct, but Spring's > ContentNegotiatingViewResolver will not be able to determine which kind of > return format the caller is expecting (registered extensions are '.json' and > '.xml', hence ".org" is not recognized) > > After some googling (which led to a nice set of issues on Spring's JIRA), I > came to the conclusion that the following combination is (probably) the only > one working. > > Index: core/src/test/java/org/syncope/core/rest/UserTestITCase.java > =================================================================== > --- core/src/test/java/org/syncope/core/rest/UserTestITCase.java > (revisione 1326100) > +++ core/src/test/java/org/syncope/core/rest/UserTestITCase.java (copia > locale) > @@ -778,8 +778,7 @@ > userTO = restTemplate.postForObject(BASE_URL + "user/create", > userTO, UserTO.class); > > long id = userTO.getId(); > - userTO = > - restTemplate.getForObject(BASE_URL + "user/delete?username=" + > userTO.getUsername(), UserTO.class); > + userTO = restTemplate.getForObject(BASE_URL + > "user/deleteByUsername/{username}.json", UserTO.class, > userTO.getUsername()); > > assertNotNull(userTO); > assertEquals(id, userTO.getId()); > Index: > core/src/main/java/org/syncope/core/rest/controller/UserController.java > =================================================================== > --- core/src/main/java/org/syncope/core/rest/controller/UserController.java > (revisione 1326100) > +++ core/src/main/java/org/syncope/core/rest/controller/UserController.java > (copia locale) > @@ -440,8 +440,8 @@ > } > > @PreAuthorize("hasRole('USER_DELETE')") > - @RequestMapping(method = RequestMethod.GET, value = "/delete") > - public UserTO delete(@RequestParam("username") final String username) > + @RequestMapping(method = RequestMethod.GET, value = > "/deleteByUsername/{username}") > + public UserTO delete(@PathVariable final String username) > throws NotFoundException, WorkflowException, > PropagationException, UnauthorizedRoleException { > LOG.debug("User delete called with {}", username); > > > Basically, strict matching is used, but the caller (the integration test > case) must explicitly appending ".json": in this way the latest part of > matching string is stripped, but input is now correctly provided. > > WDYT? > > Regards. > > -- > Francesco Chicchiriccò > > Apache Cocoon Committer and PMC Member > http://people.apache.org/~ilgrosso/ > -- Colm O hEigeartaigh Talend Community Coder http://coders.talend.com
