6

Reading this (Spring 3) article from 2010, it discusses using an extension to provide a convenient way to include optional path segments:

@RequestMapping("/houses/[preview/][small/]{id}")
public String handlePreview(@PathVariable long id, @PathVariable("preview/") boolean preview, @PathVariable("small/") boolean small) {
    return "view";
}

I know I could just implement a number of request mappings to achieve the same effect:

@RequestMapping(value="/houses/preview/{id}")
...

@RequestMapping(value="/houses/{id}")
...
~~~ snip ~~~

But depending on the number of possible permutations, it seems like a very verbose option.

Does any later version of Spring (after 3) provide such a facility? Alternatively, is there any mechanism to chain portions of the request URL to feed a larger response method signature?

Update

This answer to a question relating to sharing path variables and request parameters suggests an approach like:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
    @ResponseBody
    public String getCampaignDetails(
         @PathVariable("id") String id)
    {
        ~~~ snip ~~~

But the path variable cannot be set to null. Just going to /campaigns will return a 400 response.

8
  • 1
    Do you want like stackoverflow.com/questions/2745471/… Commented Sep 11, 2014 at 9:49
  • Nearly, Javi's answer with the multiple request values - value={"/campaigns","/campaigns/{id}"} is very nearly there, but I'd like to map fixed segments in the URL. Commented Sep 11, 2014 at 10:05
  • this question already discussed on one forum, this is same asked here: java.dzone.com/articles/spring-3-webmvc-optional-path Commented Sep 11, 2014 at 10:07
  • Yes, that's the article I link to in my question... hence why I'm asking for alternatives. ;) Commented Sep 11, 2014 at 10:11
  • 1
    If all else fails, you could always rewrite the URLs with filter like this one: tuckey.org/urlrewrite Commented Sep 11, 2014 at 13:07

1 Answer 1

8

Why you don't use java.util.Optional if you are using Java 1.8. To take your later example, you can avert a 400 response with put a Optional<String> instead of String representing your eventualy path like this:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
@ResponseBody
public String getCampaignDetails(
     @PathVariable("id") Optional<String> id)
{ 
  if(id.isPresent()){
      model.addAttribute("id", id.get());//id.get() return your String path
  }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.