SpringBoot를 로그인 화면을 만들 때 발생할 수 있는 여러 예외를 처리하는 코드를 작성했을 때 406 Not Acceptable 에러가 뜨면서 아래와 같은 메시지가 나타났다. 406 에러는 서버에서 허용하지 않은 형태의 정보가 들어왔기 때문에 발생한다.
Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
이는
@AllArgsConstructor
@Getter // Getter를 작성하지 않아서 발생한 문제
public class Response<T> {
private String resultCode;
private T result;
public static Response<Void> error(String resultCode){
return new Response(resultCode, null);
}
public static <T> Response<T> success(T result) {
return new Response("SUCCESS", result);
}
}
이는 Reponse라는 https의 응답코드를 받을 수 있는 제네릭 클래스를 작성할 때 @Getter를 작성하지 않았기 때문에 발생했다. @Getter
넣어주지 않으면 RestController에서 Response.success()를 통해서 값을 return 해줄 때 private으로 선언한 result에 담긴 값이 넘어가지 않게 된다. 따라서 서버에서 허용하는 형태의 값을 응답하지 못해서 위와 같은 에러 메시지가 뜨게 되었다.
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
@Slf4j
public class UserController {
private final UserService userService;
@PostMapping("/join")
public Response<UserJoinResponse> join(@RequestBody UserJoinRequest userJoinRequest){
log.info(userJoinRequest.getUserName(), userJoinRequest.getEmail());
UserDto userDto = userService.join(userJoinRequest);
return Response.success(new UserJoinResponse(userDto.getUserName(), userDto.getEmailAddress()));
}
}