Java Spring引导RestController继承和不明确映射问题
我正在尝试为我的Spring Boot Rest项目实现继承的控制器。正如您在示例代码片段中看到的,我在BaseTableController中为所有控制器提供了标准端点,但对于一些具体的控制器,我需要重写方法。当我这样实现它时,我得到了Java Spring引导RestController继承和不明确映射问题,java,spring,spring-boot,spring-restcontroller,Java,Spring,Spring Boot,Spring Restcontroller,我正在尝试为我的Spring Boot Rest项目实现继承的控制器。正如您在示例代码片段中看到的,我在BaseTableController中为所有控制器提供了标准端点,但对于一些具体的控制器,我需要重写方法。当我这样实现它时,我得到了不明确的映射。启动时无法映射“clientRfmController”方法异常 public abstract class BaseTableController<T extends BaseTableModel> { @Override
不明确的映射。启动时无法映射“clientRfmController”方法
异常
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);
}
}
-
正在父类和子类中重复,因此您将面临不明确的映射。请更改其中一个的路径。我知道它们具有相同的映射。我希望RequestMappingHandlerMapping选择子控制器的方法。我知道它们有相同的映射。我希望RequestMappingHandlerMapping选择子控制器的方法。您有重复的映射,无论是否重写,都无法将同一URL映射到不同的方法。所以不,这不是解决问题的方法。不要扩展基类,只实现这里的逻辑。@M.Deinum这是控制器的一小部分。我在基本控制器上有许多不同的方法。我只想用相同的url覆盖其中一个。您不能,因为所有元数据都将被处理,从而导致相同的url/映射。只有当映射不同时,它才会起作用。显然,您正在添加一个不同的参数,以便在映射信息中包含该参数以具有唯一映射。如果存在重复的映射,则无论是否重写,都无法将同一URL映射到不同的方法。所以不,这不是解决问题的方法。不要扩展基类,只实现这里的逻辑。@M.Deinum这是控制器的一小部分。我在基本控制器上有许多不同的方法。我只想用相同的url覆盖其中一个。您不能,因为所有元数据都将被处理,从而导致相同的url/映射。只有当映射不同时,它才会起作用。显然,您正在添加一个不同的参数,以便在映射信息中包含该参数,以获得唯一的映射。
@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;
}
}
@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);
}
}
@GetMapping({
PATH_GET,
PATH_VIEW_GET}
)