🎯문제1
Nexacro와 SpringBoot를 연동하여 데이터를 주고 받으려는데 아래 에러가 발생함
Could not write JSON: Infinite recursion (StackOverflowError)
...
java.lang.IllegalStateException: getOutputStream() has already been called for this response
원인
아래는 내가 작성한 Nexacro 전용 Controller 코드
@RestController
@RequestMapping("/nexacro")
@RequiredArgsConstructor
public class NexacroDashboardController {
@GetMapping("/dashboard")
public NexacroResult getDashboard() {
...
return result;
}
}
이때 @RestController는 내부적으로 @Controller + @ResponseBody와 같음
따라서 NexacroResult를 JSON으로 변환하여 응답하려고 하는데, NexacroResult는 내부에 Dataset, PlatformData, View 등의 객체를 갖고 있기 때문에 JSON 직렬화를 시도하면 A --> B --> C --> A 식으로 순환 참조가 발생함
그래서 Infinite recursion (StackOverflowError) 에러가 발생한 것
첫 번째 오류 발생 후, NexacroMappingExceptionResolver가 예외 응답을 내려 하는데 이미 Spring이 JSON Writer를 사용하여 JSON 응답을 내기 시작함
그 상태에서 NexacroView가 XML OutputStream을 사용하려 시도했기 때문에 두 번째 오류가 발생한 것
해결
@RestController를 @Controller로 변경
이 경우 NexacroAdapter가 NexacroResult --> Dataset --> XML로 처리
결과
서버의 데이터가 잘 받아와지는 것 확인

🎯문제2
DTO를 Dataset으로 변환하여 NexacroResult로 보내는 코드를 아래와 같이 작성
public static NexacroResult toResult(DashboardDto dashboardDto) {
NexacroResult result = new NexacroResult();
// 요약 카드
DashboardSummary summary = new DashboardSummary(
dashboardDto.getTotalItemCount(),
...
);
result.addDataSet("dsSummary", List.of(summary));
// 카테고리별 재고
result.addDataSet(
"dsCategoryStock",
dashboardDto.getCategoryStocks()
);
...
return result;
}
그러나 Nexacro에서 dsSummary를 인식하지 못하는 상황 발생

trace()를 통해 데이터셋의 상태를 확인해보았더니 아래와 같이 비어있는 것을 확인할 수 있었다

위 데이터셋을 제외한 다른 데이터셋은 인식이 잘 되는 상황이었기에 연동 자체가 실패한 것은 아니었음
원인
인식되지 않은 데이터셋의 DTO를 아래와 같이 immutable 스타일로 작성함
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class DashboardSummary {
private int totalItemCount;
private int totalStockQty;
private int lowStockCount;
private int categoryCount;
}
Nexacro Adapter가 내부적으로 Java Bean --> Dataset 변환을 할 때 다음 조건들을 기대하는 경우가 많음
- 기본 생성자(NoArgsConstructor)
- setter/getter
- 일반적인 JavaBean 형태
- 복합 타입이 아닌 단순 DTO
그러나 내가 작성한 summary DTO는 기본 생성자와 setter가 없는 읽기 전용 객체이기 때문에, 어댑터가 데이터셋으로 제대로 변환하지 못한 것
반면 다른 DTO는 완전한 JavaBean 형태이기 때문에 Dataset 생성에 성공함
해결
@Setter, @NoArgsConstructor를 추가하여 일반 DTO로 변경
결과
원래 데이터를 인식하지 못하고 '0개'로 뜨던 값들이 제대로 뜨는 것을 확인할 수 있음

'트러블슈팅' 카테고리의 다른 글
| [트러블슈팅/SpringBoot] Nexacro 연동 시 발생한 의존성 문제 (0) | 2026.06.12 |
|---|---|
| [트러블슈팅/SpringBoot] 415 오류: Content-Type 'application/octet-stream' is not supported (0) | 2026.05.19 |
| [트러블슈팅/SpringBoot] WebMvcTest로 Controller 테스트 시 JwtUtil 인식 안 됨 (1) | 2026.03.11 |
| [트러블슈팅/SpringBoot] Builder 필드 초기값 누락 (0) | 2026.01.22 |
| [트러블슈팅/GitHub] 원격저장소 - 로컬저장소 기록(history) 병합 (0) | 2026.01.17 |