에러내용
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Ambiguous handler methods mapped for '/members/1':
{public com.jong.post.domain.member.response.MemberResponse com.jong.post.domain.member.controller.MemberController.findByUsername(java.lang.String),
public com.jong.post.domain.member.response.MemberResponse com.jong.post.domain.member.controller.MemberController.findById(java.lang.Long)}
에러원인
MemberCotroller 을 작성하고 test 코드를 작성 중에 해당 에러를 접했다.
에러내용에서 Ambiguous(모호하다) 라는데, 어디가 애매한지 확인해보았다.
@Test
@DisplayName("ID_회원찾기")
void findById() throws Exception {
Member member = Member.builder()
.username("username")
.password(passwordEncoder.encode("1234"))
.name("name")
.nickname("nickname")
.age(28)
.role(Role.USER)
.build();
memberRepository.save(member);
mockMvc.perform(get("/members/{id}", member.getId())
.contentType(APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(print());
}
일단 테스트 코드인데, 조회하는곳에서 모호하다니까 MemberController 에서 확인해보았다.
@GetMapping("/{id}") // 단건조회 id
public MemberResponse findById(@PathVariable Long id) {
return memberService.findById(id);
}
@GetMapping("/{username}") // 단건조회 username
public MemberResponse findByUsername(@PathVariable String username) {
return memberService.findByUsername(username);
}
id 로 단건을 조회하는것과 username 으로 단건을 조회할 수 있도록 만들었는데, 해당 부분에서 에러가 발생했다는 것을 알았다.
조건은 유지하고 싶어 아래와 같이 경로를 구분할 수 있게끔 바꾸어주어 해결했다.
에러조치
@GetMapping("/member/{id}") // 단건조회 id
public MemberResponse findById(@PathVariable Long id) {
return memberService.findById(id);
}
@GetMapping("/username/{username}") // 단건조회 username
public MemberResponse findByUsername(@PathVariable String username) {
return memberService.findByUsername(username);
}
댓글