[트러블슈팅/SpringBoot] Nexacro Dataset 인식 안 됨

2026. 6. 13. 17:11·트러블슈팅

🎯문제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
'트러블슈팅' 카테고리의 다른 글
  • [트러블슈팅/SpringBoot] Nexacro 연동 시 발생한 의존성 문제
  • [트러블슈팅/SpringBoot] 415 오류: Content-Type 'application/octet-stream' is not supported
  • [트러블슈팅/SpringBoot] WebMvcTest로 Controller 테스트 시 JwtUtil 인식 안 됨
  • [트러블슈팅/SpringBoot] Builder 필드 초기값 누락
naahy
naahy
  • naahy
    종합장
    naahy
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Java
      • SpringBoot
      • Git
      • 트러블슈팅
      • Vue.js
      • Kotlin
      • Node.js
      • 코딩테스트
        • 백준
        • 프로그래머스
      • 스터디
        • CS
        • 알고리즘
      • -
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

    Nexacro
    github
    이분탐색
    투포인터
    프로그래머스
    React
    백트래킹
    API
    mongodb
    SpringBoot
    코틀린
    브루트포스
    node.js
    cs
    자바
    백준
    Java
    bfs
    트러블슈팅
    Kotlin
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
naahy
[트러블슈팅/SpringBoot] Nexacro Dataset 인식 안 됨
상단으로

티스토리툴바