/////
Search
👨‍👩‍👧

부모엔티티와 자식엔티티 그리고 NullPointerException

태그
JPA
Exception

갑자기 NullPointerException 이?

게시글을 생성 요청을 보냈는데, 아래와 같은 에러가 절 반겨주었습니다.
java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because "this.hashTags" is null at com.example.feedservice.domain.post.domain.Post.mappingHashTag(Post.java:46) ~[classes/:na] at com.example.feedservice.domain.hashtag.HashTag.mappingPost(HashTag.java:34) ~[classes/:na] at com.example.feedservice.domain.post.service.PostService.createPost(PostService.java:86) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
Markdown
복사
에러로그를 찬찬히 살펴보니 해시태그 리스트 생성에 문제가 생긴모양
바로 달려가서 코드를 살펴보았습니다. 틀린게 없다고 생각이 들었지만, this.hashTags 가 null 이라는데…
@Transactional public PostResponse createPost(PostCreateRequest postCreateRequest) { User user = authUtil.getLoginUser() .orElseThrow(() -> new ApiException(ErrorType.USER_NOT_FOUND)); Post createPost = Post.builder() .title(postCreateRequest.getTitle()) .description(postCreateRequest.getDescription()) .shareCount(0L) .viewCount(0L) .heartCount(0L) .user(user) .createdAt(LocalDateTime.now()) .build(); postRepository.save(createPost); String[] words = postCreateRequest.getHashTags().split(" "); for (String word : words) { if (word.startsWith("#") && word.length() > 1) { word = word.substring(1); HashTag hashTag = HashTag.builder() .hashTag(word) .build(); hashTag.mappingPost(createPost); hashTagRepository.save(hashTag); } } List<String[]> hashTags = new ArrayList<>(); for (HashTag temp : createPost.getHashTags()) { hashTags.add(new String[]{String.valueOf(temp.getId()), temp.getHashTag()}); } PostResponse postResponse = PostResponse.builder() .id(createPost.getId()) .title(createPost.getTitle()) .description(createPost.getDescription()) .hashTags(hashTags) .heartCount(createPost.getHeartCount()) .shareCount(createPost.getShareCount()) .viewCount(createPost.getViewCount()) .createdAt(createPost.getCreatedAt()) .build(); return postResponse; }
Java
복사
문제의 원인은 포스트를 생성하는 곳에 있었습니다. 아래에서 해시태그를 매핑하고, 저장했기 때문에 괜찮겠지라고 생각했지만 그게 아니였습니다 아래와 같이 모든 값을 다 만들어주고줘야 합니다. hashTag 와 같이 늦게 처리해야 하는경우에는 new ArrayList<>() 를 넣어주세요.
Post createPost = Post.builder() .title(postCreateRequest.getTitle()) .description(postCreateRequest.getDescription()) .shareCount(0L) .viewCount(0L) .heartCount(0L) .hashTags(new ArrayList<>()) .user(user) .createdAt(LocalDateTime.now()) .build();
Java
복사

결과