개발하는 쿠키
article thumbnail

문제를 발견하게 된 과정

Oracle Open JDK17에서 빌드할 땐 잘 되는데 Gitlab CLI로 DEV에 Build하면 오류가 발생했습니다.

builds/[파일경로]/[파일명].java:11:
error: 
Internal error in the mapping processor: 
java.lang.NullPointerException: 
Cannot invoke "com.sun.tools.javac.code.Symbol.getEnclosingElement()" because "sym" is null

 

문제 코드

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface Mapper {
    @Mapping(source = "code.code", target = "code")
    @Mapping(source = "code.name", target = "name")
    ItemDto builderItemDto(Item Item, CommonCode code);
}
public record CommonCode(
        String code,
        String name
) {
}

문제의 원인

Record class의 필드를 Mapper interface 의 @Mapping 어노테이션에서 조회하지 못해서 에러가 났습니다.

https://github.com/mapstruct/mapstruct/issues/2683

로컬에서 사용하고 있는 JDK 버전과 DEV환경에서 사용하고 있는 JDK 버전이 달라서 발생한 문제였습니다.

DEV JDK version: 17.0

로컬 JDK version: 17.5

17.0 버전 이전에서는 record class build 에러가 발생했던 것 같은데, 17.X 버전 이후부터 개선이 된 것 같습니다.

 

문제를 해결한 방법

방법1. Record class를 사용하지 않는 방법으로 고쳤습니다.

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface Mapper {
    @Mapping(source = "code", target = "code")
    @Mapping(source = "name", target = "name")
    ItemDto builderItemDto(Item Item, String code, String name);
}

방법2. 이후에 DEV JDK version을 17.5로 올리고, record class를 사용하는 코드로 수정했습니다.

반응형
profile

개발하는 쿠키

@COOKIE_

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!