해결된 질문
작성
·
214
·
수정됨
1
@Bean
public Consumer<Message<PaymentEventMessage>> consume() {
return message -> {
PaymentEventMessage payload = message.getPayload();
LedgerEventMessage ledgerEventMessage = doubleLedgerEntryRecordUseCase.recordDoubleLedgerEntry(message.getPayload());
streamBridge.send("ledger", ledgerEventMessage);
};
}
해당 로직은 Ledger 서비스의 Kafka 메시지 Consumer 역할을 맡고 있는 'consume' 메소드 입니다.
정상적으로 결제 confirm 완료가 되면 Kafka 에 메시지를 정상적으로 등록 된 것을 확인 하였는데요.
이 후 consumer 에서 메시지를 잘 가지고 오지만 byte[] 타입이라 PaymentEventMessage 로 타입캐스트 하는데 문제가 발생되네요..
Kafka 설정에서 Deserialize 설정만 해주면 되는 느낌인데... 구글링 해봐도... 잘 안되어서 이렇게 질문 드립니다!
에러 문구
class [B cannot be cast to class com.example.ledgerservice.ledger.domain.PaymentEventMessage ([B is in module java.base of loader 'bootstrap'; com.example.ledgerservice.ledger.domain.PaymentEventMessage is in unnamed module of loader 'app')
답변 1
0
안녕하세요~ 질문 남겨주셔서 감사합니다.
저도 이전에 이런 에러를 본 적이 있는데 직렬화 과정에서 에러가 나는 것 같아요. Spring MVC 의존성을 넣어주시면 될 것 같은데 한번 추가해 보실래요?
Spring MVC 에 직렬화/역직렬화에 필요한 의존성이 들어가 있어서 이걸 추가하면 될 것 같습니다.
한번 추가해 보시고 안되면 말씀해 주세요~
앗 안되시나보네요. 혹시 제가 따로 코드를 실행해 볼 수 있도록 git 레파지토리 있으실까요? 중요한 시크릿 정보들은 제외해서 레파지토리 링크 주시면 제가 따로 해보고 연락드릴게요~
안녕하세요~ 살펴보니까 아래와 같이 PaymentEventMessage 에 기본 생성자가 없어서 역직렬화에 실패하고 있었어요. 이거 추가하시면 잘 될겁니다.
기본 생성자가 필요한 이유는 Jackson이 객체를 역직렬화할 때 자바의 리플렉션(Reflection)을 사용하여 객체를 생성하고, 이후에 각 필드에 값을 설정하기 때문이에요.
(리플렉션(Reflection)은 프로그램이 실행 중에 클래스, 메소드, 필드, 인터페이스 등을 동적으로 조사하고 수정할 수 있는 메커니즘을 말해요.)
기본 생성자를 추가하는 방법 이외에도 Jackson 애노테이션을 추가하는 방법도 있으니 찾아보시면 나올거에요~
이것 때문에 강의 진도도 못 나가셨을 것 같아요.. 고생하셨습니다.
안녕하세요 답변 감사합니다!
기존에는
추가한 상태에서 문제가 있었고
혹시 몰라서
이 부분도 추가 해서 다시 한번 TEST 해보았지만 다시 동일한 문제가 발생되네요 ㅠ,ㅠ