Если вы хотите связать typeX
и typeY
, то вам обязательно нужно 2 обработчика. Но, почему бы не мы используем param
вариант @RequestMapping
:
@RequestMapping(method = RequestMethod.POST,
value = "/url", params = "session_type=typeX")
public String handleTypeX(@RequestBody @ModelAttribute TypeX typeX){
//TODO implement
}
@RequestMapping(method = RequestMethod.POST,
value = "/url", params = "session_type=typeY")
public String handleTypeY(@RequestBody @ModelAttribute TypeY typeY){
//TODO implement
}
Если вам нужны какие-то препараты (ФЭ нормализовать Params или выполнить модель связывания вручную), то подход выше, вы можете комбинировать вместе с @InitBinder
, но обратите внимание, , что @InitBinder
нуждается в точных правилах ULR вместе с параметрами @ModelAttribute
в обработчиках.
РЕДАКТИРОВАТЬ: В Spring MVC нет никакой возможности использовать 2 обработчик для точного URL, то есть когда метод/URL/PARAMS/потребляет типа являются одинаковыми.
Таким образом, я предлагаю использовать унифицированный обработчик, в котором вы должны проверить необходимый параметр, а затем вручную преобразовать в соответствующий класс. Для нахождения необходимого класса я полагаю, было бы лучше использовать Strategy pattern:
//class resolver according "session_type" parameter
//note, that you can use Spring autowiring capabilities
private final Map<String, Class> TYPES_CONTEXT = new HashMap<String, Class>(){
{
this.put("x", TypeX.class);
this.put("y", TypeY.class);
//TODO probably other classes
}
}
@RequestMapping(method = RequestMethod.POST,
value = "/url")
public @ResponseBody String handleAnyType(@RequestBody Map<String, String> body){
String sessionType = body.get("session_type");
//TODO handle case if sessionType is NULL
Class convertedClass = TYPES_CONTEXT.get(sessionType);
//TODO handle case if class is not found
Object actualObject = objectMapper.convertValue(body, convertedClass);
//now we use reflection for actual handlers, but you may refactor this in the way you want, f.e. again with Strategy pattern
//note that current approach there should be contract for methods names
Method actualHandler = this.getClass().getMethod("handle" + actualObject.getClass().getSimpleName());
return (String)actualHandler.invoke(this, actualObject);
}
public String handleTypeX(TypeX typeX){
//TODO implement
}
public String handleTypeY(TypeY typeY){
//TODO implement
}
//TODO probably other methods
Этот подход не обрабатывает проверки и некоторые вещи, которые были опущены, но я считаю, что это может быть полезным.
Почему вы не изменяете свои URI на '/ context/resources/typex' и'/context/resources/typey'? –
Требование о том, что URL-адреса должны быть одинаковыми, поскольку существует разница только в SessionType. –
Вы получите лучший ответ, если вы объясните, что означает «тип сеанса». –