728x90
반응형
자바 스프링(Java Spring) [org.springframework.beans.factory.BeanCreationException] 오류 해결
오류 내용
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.27.jar:5.3.27]
atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.27.jar:5.3.27] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.27.jar:5.3.27]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.27.jar:5.3.27]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.27.jar:5.3.27]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.27.jar:5.3.27]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) ~[spring-context-5.3.27.jar:5.3.27]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.27.jar:5.3.27]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.12.jar:2.7.12]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) [spring-boot-2.7.12.jar:2.7.12]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.12.jar:2.7.12]at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.7.12.jar:2.7.12]
............
오류 이유
위 에러는 A라는 클래스 가 있을 때, A1() 메서드와 A2() 메서드를 생성했을 때, 동일한 Mapping 처리를 한 것이 문제였다. 스프링은 매핑을 처리할 때 경로와 HTTP 메서드를 기반으로 매핑을 식별하는데, 동일한 경로에 여러 개의 메서드가 매핑되면 충돌이 발생하게 된다. 이러한 충돌을 해결하기 위해서는 매핑을 고유하게 만들어야 한다.
오류 코드
@GetMapping
public ResponseEntity<?> retrieveTodoList(){
String temporaryUserId = "temporary-user"; // temporary user id
// 1. 서비스 메서드의 retrieve() 메서드를 사용해 Todo 리스트를 가져온다.
List<TodoEntity> entities = service.retrieve(temporaryUserId);
// 2. 자바 스트림을 이용해 리턴된 엔티티 리스트를 TodoDTO 리스트로 변환
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
// 3. 변환된 TodoDTO 리스트를 이용해 reponseDTO를 초기화
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
// 4. ResponseDTo를 리턴
return ResponseEntity.ok().body(response);
}
@GetMapping
public ResponseEntity<?> updateTodo(@RequestBody TodoDTO dto){
String temporaryUserId = "temporary-user"; // temporary user id.
TodoEntity entity = TodoDTO.toEntity(dto);
entity.setUserId(temporaryUserId);
List<TodoEntity> entities= service.update(entity);
List<TodoDTO> dtos = entities.stream().map(TodoDTO::new).collect(Collectors.toList());
ResponseDTO<TodoDTO> response = ResponseDTO.<TodoDTO>builder().data(dtos).build();
return ResponseEntity.ok().body(response);
}
이클립스에서 콘솔창을 확인하면 오류에 대한 내용과 위치가 나온다.
코드량이 많으면 찾기 쉽지 않을 때는 콘솔창을 확인하면 된다.
실수로 update와 retrieve 메서드 위에 @GetMapping 어노테이션이 지정되었는데, updateTodo의 어노테이션을
@PutMapping으로 바꿔줘야 실행이 가능하다.
그리고 매핑 충돌을 위해 각각 다른 경로를 설정 해주는게 좋다.
예시 코드
@GetMapping("/todos") // retrieveTodoList() 메서드에 대한 매핑
public List<TodoDTO> retrieveTodoList() {
// ...
}
@PostMapping("/todo") // updateTodo() 메서드에 대한 매핑
public TodoDTO updateTodo(@RequestBody TodoDTO todoDTO) {
// ...
}
위 코드처럼 다른 경로 설정과 알맞은 어노테이션으로 매핑해주면 정상적으로 실행된다.
실행 화면
728x90
반응형