Java-Controller引起的Ambiguous mapping问题解决

x33g5p2x  于2022-03-25 转载在 Java  
字(1.9k)|赞(0)|评价(0)|浏览(568)

问题描述

出现java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'xxx' method异常。

通过上面代码我们可以看出来当spring添加Controller的接口Mapping的时候会先进行效验,如果以存在相同的Mapping了,并且方法来源不是同一个类,那么就会报错

比如:

  1. 子类继承父类的Controller的方法,url都一样
  2. 两个不同类的Controller内的方法url地址都一样,但是方法行为都不同(名称.参数,返回值…)
    总结: 只要出现相同的url接口就会报错

解决办法

  1. 重写RequestMappingHandlerMapping的getMappingForMethod方法。
  2. 判断是准备注册的Mapping是否以存在
  3. 如果存在那么就将原来的Mapping删除使用现在的Mapping

代码

  1. //解决重写Controller, 方法参数返回值不一致的问题,
  2. //解决办法就是如果子类中有相同路径的url接口那么就不映射父类的url接口了
  3. public class PathTweakingRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
  4. //handlerType.equals(ParentclassController.class) || handlerType.equals(SubclassController.class)
  5. @Override
  6. protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
  7. RequestMappingInfo methodMapping = super.getMappingForMethod(method, handlerType);
  8. if (methodMapping==null) {
  9. return methodMapping;
  10. }
  11. Map<RequestMappingInfo, HandlerMethod> handlerMethods = super.getHandlerMethods();
  12. for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet()) {
  13. for (String pattern : requestMappingInfoHandlerMethodEntry.getKey().getPatternsCondition().getPatterns()) {
  14. for (String s : methodMapping.getPatternsCondition().getPatterns()) {
  15. if (pattern.equals(s)) { //发现有重复的
  16. //删除原来的
  17. super.unregisterMapping(requestMappingInfoHandlerMethodEntry.getKey());
  18. return null;
  19. }
  20. }
  21. }
  22. }
  23. return methodMapping;
  24. }
  25. }
  1. package com.schemautils.config;
  2. import com.schemautils.PathTweakingRequestMappingHandlerMapping;
  3. import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class WebMvcRegistrationsConfig implements WebMvcRegistrations {
  7. @Override
  8. public PathTweakingRequestMappingHandlerMapping getRequestMappingHandlerMapping() {
  9. return new PathTweakingRequestMappingHandlerMapping();
  10. }
  11. }

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章

最新文章

更多