쓰레기 기록 메인 페이지에서 인증된 특정 사용자의 특정 게시글을 클릭하면 특정 데이터를 가지고 있는 쓰레기 기록 상세 페이지를 조회하는데 실패하는 상황
Spring Boot의 모호한 핸들러 매핑 문제
2024-10-29T20:30:10.827+09:00 ERROR 628 --- [ecogrow-backend][nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: Ambiguous handler methods mapped for '/api/waste/record/3': {public org.springframework.http.ResponseEntity com.sw.ecogrowbackend.domain.waste.controller.WasteRecordController.getWasteRecords(java.lang.Long), public org.springframework.http.ResponseEntity com.sw.ecogrowbackend.domain.waste.controller.WasteRecordController.getWasteRecord(java.lang.Long)}] with root cause java.lang.IllegalStateException: Ambiguous handler methods mapped for '/api/waste/record/3': {public org.springframework.http.ResponseEntity com.sw.ecogrowbackend.domain.waste.controller.WasteRecordController.getWasteRecords(java.lang.Long), public org.springframework.http.ResponseEntity com.sw.ecogrowbackend.domain.waste.controller.WasteRecordController.getWasteRecord(java.lang.Long)} at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:431) ~[spring-webmvc-6.1.12.jar:6.1.12] at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382) ~[spring-webmvc-6.1.12.jar:6.1.12] at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127) ~[spring-webmvc-6.1.12.jar:6.1.12] at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68) ~[spring-webmvc-6.1.12.jar:6.1.12] at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:507) ~[spring-webmvc-6.1.12.jar:6.1.12] at
쓰레기 기록에 관한 controller 에서 동일한 경로 /api/waste/record/{id}에 매핑된 두 개의 핸들러 메서드가 있기 때문.
getWasteRecord(@PathVariable Long RecordId): recordId로 단일 폐기물 기록을 가져오기 위해 /api/waste/record/{recordId}에 매핑
getWasteRecords(@PathVariable Long userId): userId를 기반으로 특정 사용자에 대한 모든 레코드를 가져오기 위한 /api/waste/record/{userId}에도 매핑
두 메소드 모두 동일한 기본 경로(/api/waste/record/{id})를 사용하기 때문에 Spring은 경로 변수를 사용하여 이 경로에 요청이 이루어질 때 사용할 핸들러 메소드를 결정할 수 없으며 '모호한 핸들러'가 발생.
문제를 해결하기 위해 하나의 경로를 변경하면 됨.
'기록' 이라는 용어는 개별 항목과 더 밀접하게 연관되어 있으므로 단일 기록 검색을 /api/waste/record/{recordId}
에 유지하고 사용자별 기록을 '/api/waste/record/user/{userId}로 최신화 하는 것이 좋음