I have a webservice like
@GET
@Produces("application/json")
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public Month getResult(@PathParam("parameter1") String parameter1, @PathParam("param2") PathSegment param2 , @PathParam("param3") PathSegment param3, @PathParam("param4") PathSegment param4) {
return action.getResult(parameter1, new Integer(param2.getPath()), new Integer(param3.getPath()), new Integer(param3.getPath()));
}
If I call this web service from my test class, it works fine; but if I call it through the browser, I get message as cannot find the service.
The url I am using through the browser is
http://localhost:8080/WebApp/services/seating/mylogin/july/1,0,0/month
if I use the url as
http://localhost:8080/WebApp/services/seating/mylogin/fly/1/0/0/month
and change the path in the service accordingly it works fine, but the requirement is to use comma instead of slash. Is there any way we can use the webservice with comma-separated parameters in the url?
For me there is no problem with separating multiple parameters with a comma, even if these are part of the path instead of being query parameters. I tested it and it actually works.
Actually you can even directly bind to int
if you do not need to check for correctness of these parameters. I did use @PathVariable
for these binding.
@GET
@Produces("application/json")
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public Month getResult(@PathVariable("parameter1") String parameter1, @PathVariable("param2") int param2 , @PathVariable("param3") int param3, @PathVariable("param4") int param4) {
return action.getResult(parameter1, param2, param3,param3);
}
As for the code I tested this is it:
@Controller
public class InfoController {
@RequestMapping(method = RequestMethod.GET, value = "/seating/{param1},{param2},{param3}/month")
public String showMonthView(Model uiModel, @PathVariable("param1") int p1,
@PathVariable("param2") int p2, @PathVariable("param3") int p3,
HttpServletRequest httpServletRequest) {
LOG.debug(String.format("view:/seating/%d,%d,%d/month", p1, p2, p3));
uiModel.addAttribute("param1", p1);
uiModel.addAttribute("param2", p2);
uiModel.addAttribute("param3", p3);
return "month";
}
@ResponseBody
@RequestMapping(method = RequestMethod.GET, value = "/seating/{param1},{param2},{param3}/month", produces="application/json")
public Map<String, Integer> showMonthJson(@PathVariable("param1") final int p1,
@PathVariable("param2") final int p2, @PathVariable("param3") final int p3) {
LOG.debug(String.format("json:/seating/%d,%d,%d/month", p1, p2, p3));
Map<String, Integer> result = new HashMap<String, Integer>() {{
put("param1", p1);
put("param2", p2);
put("param3", p3);
}};
return result;
}
}
With a correct view located at /seating/month.jsp for the first method.
Alternatively, returning an entity composed of the 3 params and producing json or xml makes no problem either.