스프링
Spring controller response when first char lowerCase and next upperCase
du.study
2021. 8. 15. 19:16
728x90
해당 블로그에도 나와있는 이슈
최근 개발을 하던 도중 조금 특이한 경우를 만났습니다.
간단한 예제코드
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class TestController{
@GetMapping("/test1")
fun test1() : ResponseDto{
return ResponseDto("test")
}
}
class ResponseDto(val mId: String)
위와 같은경우 예상되는 response로 mId ( I가 대문자) 를 원하였지만.. 실제 결과는 다음과 같이 나왔습니다.
{
"mid": "test"
}
오늘도 지식이 짧았음을 느낍니다.. 이부분을 파고들어가서 대체 왜 이렇게 동작하는지 살펴봤습니다.
BeanPropertyWriter 에서 prop name이 어떤식으로 가져와지는지를 확인해봤습니다.
해당부분을 보면 getMId로 앞 글자가 대문자로 치환되어있는걸 볼 수 있는데요, 실제 java로 컨버팅된 코드를 보면 ResponseDto는 다음과같이 되어있습니다.
public final class ResponseDto {
@NotNull
private final String mId;
@NotNull
public final String getMId() {
return this.mId;
}
public ResponseDto(@NotNull String mId) {
Intrinsics.checkNotNullParameter(mId, "mId");
super();
this.mId = mId;
}
}
해결방법 :
코틀린을 사용하는 경우 다음과같이 적용하면되고 자바의 경우 getter JsonProperty를 적용하면됩니다.
class ResponseDto(
@get:JsonProperty("mId")
val mId: String
)
public final class ResponseDto {
@NotNull
private final String mId;
@NotNull
public final String getMId() {
return this.mId;
}
public ResponseDto(@NotNull String mId) {
Intrinsics.checkNotNullParameter(mId, "mId");
super();
this.mId = mId;
}
}
728x90