Java Spring引导RestController继承和不明确映射问题

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

我正在尝试为我的Spring Boot Rest项目实现继承的控制器。正如您在示例代码片段中看到的,我在BaseTableController中为所有控制器提供了标准端点,但对于一些具体的控制器,我需要重写方法。当我这样实现它时,我得到了
不明确的映射。启动时无法映射“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);
    }
}
-

  • 这是正确的处理方法吗
  • 当我添加@EnableWebMvc注释时,这将变得毫无用处。还有更通用的解决方案吗
  • 正在父类和子类中重复,因此您将面临不明确的映射。请更改一个的路径


    正在父类和子类中重复,因此您将面临不明确的映射。请更改其中一个的路径。

    我知道它们具有相同的映射。我希望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}
        )