Я пытаюсь реализовать унаследованные контроллеры для моего проекта Spring Boot Rest.Как вы видите в примерах кода, у меня есть стандартные конечные точки для всех контроллеров в BaseTableController, но для некоторых конкретных контроллеров мне нужно переопределить методы.При такой реализации я получаю исключение Ambiguous mapping. Cannot map 'clientRfmController' method
при запуске.
public abstract class BaseTableController<T extends BaseTableModel> {
@Override
public BaseTableService<T> getService() {
return (BaseTableService<T>) super.getService();
}
@GetMapping({
PATH_GET,
PATH_VIEW_GET}
)
public T getWithParam(@RequestParam UUID gid) {
T t = null;
if (gid != null) {
t = getService().get(gid);
}
return getWithErrorCheck(t);
}
}
-
@RestController
@RequestMapping(TBL_CLIENTRFM)
public class ClientRfmController extends BaseTableController<ClientRfmCommon> {
@Override
public ClientRfmService getService() {
return (ClientRfmService) super.getService();
}
@GetMapping(value = {PATH_GET, PATH_VIEW_GET})
public List<ClientRfmCommon> getByAccid(Long accid, @RequestParam(required = false) UUID gid) {
List<ClientRfmCommon> byAccid = null;
if (gid != null) {
byAccid = Collections.singletonList(super.getWithParam(gid));
} else {
byAccid = Collections.singletonList(getService().getByAccid(accid));
}
return byAccid;
}
}
Я нашел обходной путь, реализовав пользовательский RequestMappingHandlerMapping.
@Configuration
public class WebMvcRegistrationsConfig implements WebMvcRegistrations {
@Override
public OoRequestMappingHandlerMapping getRequestMappingHandlerMapping() {
OoRequestMappingHandlerMapping ooRequestMappingHandlerMapping = new OoRequestMappingHandlerMapping();
ooRequestMappingHandlerMapping.setOrder(0);
return ooRequestMappingHandlerMapping;
}
}
-
public class OoRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) {
HandlerMethod existingHandlerMethod = getHandlerMethods().get(mapping);
if (existingHandlerMethod != null) {
HandlerMethod handlerMethod = createHandlerMethod(handler, method);
if (handlerMethod.getMethod().getDeclaringClass().isAssignableFrom(existingHandlerMethod.getMethod().getDeclaringClass())) {
logger.warn(handlerMethod.getBeanType().getSimpleName() + " type (" + handlerMethod.getMethod().getDeclaringClass().getSimpleName() + "->" + handlerMethod.getMethod().getName() +
") registration omitted to avoid ambigious mapping (" + existingHandlerMethod.getMethod().getDeclaringClass().getSimpleName() + "->" + existingHandlerMethod.getMethod().getName() + ")");
return;
}
unregisterMapping(mapping);
}
super.registerHandlerMethod(handler, method, mapping);
}
}
- Это правильный способ справиться с этим?
- Когда я добавляю аннотацию @EnableWebMvc, это становится бесполезным.Есть ли более общее решение?