Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, RolandD, Вы писали:
B>http://stackoverflow.com/questions/22373696/requestparam-in-spring-mvc-handling-optional-parameters
B>Можно перегрузить методы и замапить на один и тот же путь.
B>Можно повесить аннотацию на аргумент метода и там указать что этот значение в нём опционально.
Необходимо, чтобы userId и addressId были обязательными, а pageNo и pageSize — опциональными.
В то же время, хотелось бы, чтобы было несколько методов getUsers, каждый из которых обрабатывал бы свою комбинацию параметров.
Если сделать вот так:
@RequestMapping(method = RequestMethod.GET, value ="/users")
@ResponseBody
public List<User> getUsers(@RequestParam(value = "userId") Long userId,
@RequestParam(value = "pageNo", required = false) Integer pageNo,
@RequestParam(value ="pageSize", required = false) Integer pageSize){
...
}
@RequestMapping(method = RequestMethod.GET, value ="/users")
@ResponseBody
public List<User> getUsers(
@RequestParam(value = "userId") Long userId,
@RequestParam(value = "addressId") Long addressId,
@RequestParam(value = "pageNo", required = false) Integer pageNo,
@RequestParam(value ="pageSize", required = false) Integer pageSize){
...
}
То будет вот такое исключение:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'restController' method
public java.util.List<com.company.User> com.company.controller.RestController.getUsers(java.lang.Long,java.lang.Long,java.lang.Integer,java.lang.Integer)
to {[/users],methods=[GET]}: There is already 'restController' bean method
public java.util.List<com.company.User> com.company.RestController.getUsers(java.lang.Long,java.lang.Integer,java.lang.Integer) mapped.
RD>>2)
RD>>@RequestMapping(method = RequestMethod.GET, value ="/users", params = {"userId", "pageNumber", "pageSize"})
RD>>@RequestMapping(method = RequestMethod.GET, value ="/users", params = {"userId", "addressId", "pageNumber", "pageSize"})
RD>>Тогда непонятно, как сделать pageNumber и pageSize опциональными.
B>Зачем параметры в RequestMapping???
Чтобы победить это, можно сделать вот так:
@RequestMapping(method = RequestMethod.GET, value ="/users", params = {"userId", "pageNo", "pageSize"})
@ResponseBody
public List<User> getUsers(@RequestParam(value = "userId") Long userId,
@RequestParam(value = "pageNo", required = false) Integer pageNo,
@RequestParam(value ="pageSize", required = false) Integer pageSize){
...
}
@RequestMapping(method = RequestMethod.GET, value ="/users", params = {"userId", "addressId", "pageNo", "pageSize"})
@ResponseBody
public List<User> getUsers(
@RequestParam(value = "userId") Long userId,
@RequestParam(value = "addressId") Long addressId,
@RequestParam(value = "pageNo", required = false) Integer pageNo,
@RequestParam(value ="pageSize", required = false) Integer pageSize){
...
}
Тогда запросы
http://localhost:8080/users?userId=1&pageNo=0&&pageSize=10
http://localhost:8080/users?userId=1&addressId=4&pageNo=0&&pageSize=10
попадают в правильные хэндлеры, однако например (пропускаем необязательные параметры)
http://localhost:8080/users?userId=1&addressId=4
выдаст ошибку
There was an unexpected error (type=Bad Request, status=400).
Parameter conditions "userId, pageNo, pageSize" OR "userId, addressId, pageNo, pageSize" not met for actual request parameters: userId={11242}, addressId={112}
То есть получается два варианта:
1) один мега-метод, у которого есть все параметры (некоторые опциональные) и он сам разбирается, что задано, а что нет. Не подходит, поскольку хотелось бы, чтобы каждый набор параметров обрабатывался в своем методе.
2) много перегруженных методов getUsers с заданной спецификацией params в @RequestMapping. Не подходит, потому что нельзя сделать необязательные параметры.
Не подскажите, как это можно решить?