Spring RESTful url,带有可选的查询字符串

时间:2013-03-14 16:41:21

标签: java spring rest

触发默认控制器以获取所有汽车的正常uri只是“/ cars”

我希望能够搜索汽车以及uri,例如:“/ cars?model = xyz”,它将返回匹配汽车列表。所有请求参数都应该是可选的。

问题在于即使使用查询字符串,默认控制器也会触发,我总是得到“所有汽车:......”

有没有办法在没有单独搜索uri的情况下使用Spring执行此操作(例如“/ cars / search?..”)?

代码:

@Controller
@RequestMapping("/cars")
public class CarController {
@Autowired
private CarDao carDao;

@RequestMapping(method = RequestMethod.GET, value = "?")
public final @ResponseBody String find(
        @RequestParam(value = "reg", required = false) String reg,
        @RequestParam(value = "model", required = false) String model
        )
{
    Car searchForCar = new Car();
    searchForCar.setModel(model);
    searchForCar.setReg(reg);
    return "found: " + carDao.findCar(searchForCar).toString();
}

@RequestMapping(method = RequestMethod.GET)
public final @ResponseBody String getAll() {
    return "all cars: " + carDao.getAllCars().toString();
} 
}

2 个答案:

答案 0 :(得分:11)

您可以使用

@RequestMapping(method = RequestMethod.GET, params = {/* string array of params required */})
public final @ResponseBody String find(@RequestParam(value = "reg") String reg, @RequestParam(value = "model") String model)
    // logic
}

即,@RequestMapping注释具有名为params的属性。如果您指定的所有参数都包含在您的请求中(并且所有其他RequestMapping要求都匹配),那么将调用该方法。

答案 1 :(得分:1)

尝试以下方法的变体:

    @Controller
    @RequestMapping("/cars")
    public clas CarController
    {
        @RequestMapping(method = RequestMethod.get)
        public final @ResponseBody String carsHandler(
            final WebRequest webRequest)
        {
            String parameter = webRequest.getParameter("blammy");

            if (parameter == null)
            {
                return getAll();
            }
            else
            {
                return findCar(webRequest);
            }
        }
    }