[kotlin] mapstruct @Mapper와 Parameter specified as non-null is null

@Mapper에서 Parameter specified as non-null is null 에러가 발생했다.

처음에는 자카르타 NotNull, NotBlank를 잘못 걸어둔건가 했는데... 아니었다.

val name: String // 문제가 됐던 코드

코드가 run되며 name에 null이 할당되는데, 이 때 null을 허용하지 않는 타입(String)이므로 해당 에러가 발생했다.

val name: String? = "",

null이 할당되어도 오류가 나지 않게 타입을 설정해주고, empty string을 할당해주었다.

위 코드는 아래와 같은 의미를 가진다.

  • String?은 nullable String을 할당받을 수 있음을 의미한다.
  • = "" 은 empty string을 할당했음을 의미한다.
  • 즉 "null일 수 있는 변수를 선언하는데, 당장은 empty string값을 가질거야."라는 의미다.

 

이 기회에 코틀린의 null 타입 관련 연산자를 좀 공부해보자.


(1) val name: String? = ""
(2) val safeName = name ?: "" // null이라면 ""을 쓰세요

(1) 이 변수는 null 일수도 있는데요, 당장은 ""입니다. (초기값)

(2) name이 null 이라면요, ""을 쓰세요.

 

그리고 아래 코드는 컴파일 에러가 난다.

val name?: ""

 


출처 : https://0391kjy.tistory.com/51

Null을 허용하는 연산자 "?"

fun strLenSafe(s: String?) = ...

타입 이름 뒤에 물음표(?)를 붙이면 그 타입의 변수나 프로퍼티에 null을 허용할 수 있다는 뜻

 

safe call 연산자 "?."

safe call이 있다면 non-safe call도 있지 않을까? 그것이 바로 NPE(Null Pointer Exception)이다. null인 값을 호출하려고 할 때 발생하는.

이 지점에서 safe call의 의미를 추론해본다면, NPE를 방지하는 call이라는 것을 짐작할 수 있을 것이다.

호출하려는 값이 null이 아니면 그대로 메소드가 호출되고, 호출하려는 값이 null이면 이 호출은 무시되면서 null값을 반환된다.

/* null 체크가 연달아 필요한 경우 */
val country = user?.address?.country

엘비스 연산자 "?:"

fun getUserType(type: String?) {
    val userType: String = type ?: "guest" //type이 null이면 디폴트값은 guest 이다.
}

좌항의 값이 null이 아니면 좌항 값을 그대로 반환하고, 만약 좌항 값이 null이면 우항 값을 디폴트 값으로 반환한다.

혼종

val abTestType = abTestData?.type ?: defaultType

abTestData의 null체크를 한 뒤  null 일 경우 defaultType을 리턴한다.

/* 엘비스 연산자에 return, throw 사용 예제 */
val userId = user?.getId() ?: return null

val userId = user?.getId() ?: throw IllegalArgumentException("No ID")

여기 포스팅도 좋으니 읽어보길 > https://landroid.tistory.com/4