• 各位师傅求解答,什么原因


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 Brave4Teams 2024-03-30 20:01 采纳率: 20% 浏览 4 首页/ 编程语言 / 各位师傅求解答,什么原因 java org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'customerController' methodorg.rj2204.zhangs.ssmi_base.controller.CustomerController#list()to {GET [/customer/list]}: There is already 'caseInfoController' bean methodorg.rj2204.zhangs.ssmi_base.controller.CaseInfoController#list() mapped. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.30.jar:5.3.30] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921) ~[spring-context-5.3.30.jar:5.3.30] at org.springframework.context.support.AbstractAppl 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-30 20:01
      关注

      引自免费微信小程序:皆我百晓生

      在Java Spring MVC中,当@RequestMapping注解的指定方法存在两个以上相同的方法时(即@RequestMapping(value = "/customer/list", method = RequestMethod.GET)),Spring会抛出一个AmbiguityException,并导致org.springframework.beans.factory.BeanCreationException异常。

      原因在于,Spring Web框架在初始化@RequestMapping方法时,会根据注入的上下文对象进行匹配,如果存在多个具有相同名称的@RequestMapping方法,它们都会被对应的注册处理器寻找匹配的位置,并执行对应的方法。如果找不到合适的匹配位置,就会抛出AmbiguityException

      具体来说,@RequestMapping方法声明了一个路由,其映射为URL Ov"/customer/list",这意味着Spring将这个方法作为用户访问/customer路径的默认处理逻辑。然而,当Spring发现包含该路径的其他方法存在与这个默认方法相同的名称(即@RequestMapping(value = "/customer/list", method = RequestMethod.GET))时,它将首先检查这些@RequestMapping方法是否在同一个父类中,以及是否存在父类中定义的同一个名字的切面(带有@Controller注解的方法)。如果满足这两个条件,则表示存在名为@RequestMapping(value = "/customer/list", method = RequestMethod.GET)的公共接口或方法。

      下面是在Spring框架中解析并解决这个问题的一种可能方案:

      1. 在实体类(如CustomerCaseInfo等)上添加相应的@RestController注解,并在控制器方法上调用@GetMapping注解获取路由的URL映射配置信息,如value属性:
      @RestController
      @RequestMapping("/customer")
      public class CustomerController {
      
          @GetMapping("/list")
          public String list() {
              // Get the URL value from a properties file or environment variable
              String urlValue = "customer.list";
      
              // Initialize the URL mapping and any other necessary configuration
              Map urlMap = new HashMap<>();
              urlMap.put("url", urlValue);
      
              // Register the mapping as a default route
              RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping(urlMap);
              handlerMapping.setDefaultTargetPath("/customer");
      
              // Return the list method's result
              return "This is the list method for customers";
          }
      }
      
      1. 使用@Autowired注解注入一个或多个需要映射到@RequestMapping方法的资源类(如@Autowired注入了CustomerMapperCustomerEvaluator对象):
      @Service
      public class CustomerService {
          private final CustomerMapper customerMapper;
          private final CustomerEvaluator evaluator;
      
          @Autowired
          public CustomerService(CustomerMapper customerMapper, CustomerEvaluator evaluator) {
              this.customerMapper = customerMapper;
              this.evaluator = evaluator;
          }
      
          public List list() {
              // Use the provided resource classes to find the corresponding methods
              List methods = new ArrayList<>();
              for (Object resource : resources) {
                  if (resource instanceof CustomerMethod) {
                      methods.add((CustomerMethod) resource);
                  }
              }
      
              // Map the available methods to their respective URLs
              Map mappings = new HashMap<>();
              for (CustomerMethod method : methods) {
                  mappings.put(method.getName(), method.getUrl());
              }
      
              // Use the `DefaultRouteHandler` to register the URL mapping and ensure it has a matching target path
              RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping(mappings);
              handlerMapping.setDefaultTargetPath("/customer");
      
              // Execute the specified methods to retrieve the requested data
              for (CustomerMethod method : methods) {
                  List results = method.execute();
                  return results;
              }
          }
      }
      
      // Configure your application dependencies
      @Configuration
      public class AppConfig {
          // Your other configuration settings here...
      
          @Bean
          public CustomerMapper customerMapper() {
              return new CustomerMapper();
          }
      
          @Bean
          public CustomerEvaluator evaluator() {
              return new CustomerEvaluator();
          }
      }
      
      1. 使用@ControllerAdvice注解在相应的方法上创建一个统一的日志拦截器,如ExceptionAdvice,并在其中捕获并处理AmbiguityException异常:
      @ControllerAdvice
      public class ExceptionHandlingAdvice {
      
          @ExceptionHandler(AmbiguityException.class)
          public ResponseEntity handleAmbiguityException(AmbiguityException ex) {
              // Extract the error message from the exception object
              String errorMessage = ex.getMessage();
      
              // Create a response entity with the error message and status code
              ResponseEntity responseEntity = new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
              responseEntity.getBody().putSerializable("errorMessage", errorMessage);
      
              // Log the error message and HTTP status code
              log.error(errorMessage, HttpStatus.BAD_REQUEST);
              log.debug("Failed to map request to URL: {}", ex.getRequestURI());
      
              return responseEntity;
          }
      
          private void log.error(String errorMessage, HttpStatus httpStatus) {
              System.out.println("[ERROR] " + errorMessage + " - " + httpStatus);
          }
      }
      
      

      上述代码示例中,我们首先通过@RestController注解标注实体类,并设置@GetMapping方法作为URL的默认处理逻辑。然后,我们在SpringConfiguraiton配置类中注入CustomerMapperCustomerEvaluator对象,并在其中创建了多个CustomerMethod对象用于从不同的资源类获取数据。接着,在@Autowired注解中为这些资源类指定了相应的属性和方法,以便在编译时自动选择最适合的映射方式。

      接下来,我们创建了一个全局日志拦截器ExceptionHandlingAdvice,在其中对AmbiguityException异常进行处理。在handleAmbiguityException方法中,我们从异常对象中提取错误信息,并创建一个新的响应体,包含错误信息和HTTP状态码。同时,我们打印出错误消息和HTTP状态码,以便于后续跟踪和调试。

      在实际应用中,将上述代码整合到业务逻辑层,确保所有的URL映射配置都是合法且正确的,从而保证了系统的正常工作。如果在某些特定场景下,可能需要重写CustomerController及其子类的某些方法,使其更具灵活性,例如根据业务需求提供不同类型的列表方法,或者支持其他元数据(如id,name等)的引用替换。

      需要注意的是,这个解决方案只是一个基本示例,具体的实现可能会根据你的项目需求和具体情况有所调整,包括但不限于URL的正则表达式匹配、路由的动态规划、错误处理策略等。此外,如果你的系统中还包含了其他依赖库,例如Spring BootSpring Security,可能需要进一步扩展和完善代码,以适应新的版本和特性。

      展开全部

      评论 编辑记录
      • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-30 20:01
        关注

        晚上好🌙🌙🌙
        本答案参考ChatGPT-3.5

        该错误是由于存在请求映射冲突导致的。根据错误信息可以看出,在RequestMappingHandlerMapping中初始化bean时遇到了异常,异常的原因是请求映射存在冲突。

        解决该问题的方法如下:

        1. **确认项目中的控制器类和请求映射的路径是否正确。**检查代码中的控制器类的RequestMapping注解是否正确,确保每个控制器类的请求映射路径是唯一的。

        2. **检查项目中是否存在重复的RequestMapping路径。**查看项目中的控制器类,确保不同的控制器类的RequestMapping注解的路径不相同,避免存在相同的请求路径。

        3. **检查是否存在相同的请求方法和路径。**在提示信息中可以看到,customerController的list方法和caseInfoController的list方法路径冲突。检查这两个方法的请求映射路径和请求方法是否相同,如果相同,则需要修改其中一个方法的映射路径或请求方法,以解决冲突。

        4. **如果有多个请求处理方法,可以为每个方法设置不同的路径或请求方法。**如果在controller中存在多个处理方法,且其中有相同的路径和请求方法,可以为每个方法设置不同的路径或请求方法,以避免冲突。

        5. **使用@RequestMapping的value属性设置具体的请求路径。**可以为每个方法的@RequestMapping注解的value属性设置具体的请求路径,确保不会产生冲突。

        6. **使用@RequestMapping的method属性设置具体的请求方法。**如果多个方法的请求路径相同,但请求方法不同,可以使用@RequestMapping注解的method属性为每个方法指定具体的请求方法,以区分不同的处理方法。

        根据你提供的信息,以下是修改后的示例代码:

        @RestController
        @RequestMapping("/customer")
        public class CustomerController {
        
            @RequestMapping(value = "/list", method = RequestMethod.GET)
            public String list() {
                // 处理逻辑
                return "customer list";
            }
        }
        
        @RestController
        @RequestMapping("/caseInfo")
        public class CaseInfoController {
        
            @RequestMapping(value = "/list", method = RequestMethod.GET)
            public String list() {
                // 处理逻辑
                return "case info list";
            }
        }
        

        请注意,以上示例代码仅为参考,请根据实际情况进行相应的修改。

        展开全部

        评论 编辑记录
      • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-30 22:49
        关注

        【以下回答由 GPT 生成】

        希望以上解决方案对您有帮助,如果您有任何其他问题或需要进一步帮助,请随时告诉我。



        【相关推荐】



        如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
        评论
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      白话 TBW 是什么?
      Web实训项目--网页设计(附源码)
      记录linux清理空间的步骤
      手把手教你纯c实现异常捕获try-catch组件
      MySQL:连接查询 | 内连接,外连接
      Oracle 层级查询(Hierarchical Queries)
      如何理解Linux下一切皆文件
      强扩展、强一致、高可用…GaussDB成为游戏行业的心头爱
      《Similarity-based Memory Enhanced Joint Entity and Relation Extraction》论文阅读笔记
      Java学习笔记——Collection之Queue
    • 原文地址:https://ask.csdn.net/questions/8081551