• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

기선님 엑셀 다운로드 기능을 만들고 있는데 해결하기 어려운 에러가 생겨서 질문 드립니다.

19.07.18 21:36 작성 조회수 208

1

안녕하세요 기선님

제가 현재 엑셀 다운로드 기능을 구현하고 있습니다.

컨트롤러 코드는 이렇게 되어 있습니다.

initExcelData() 함수는 테스트용 데이터를 만드는 함수입니다.

그리고 아래는 AbstractXlsxView를 상속받아서 만든 ExcelXlsxView 객체입니다.

제 생각에는 이 객체가 View 인터페이스를 구현한 객체이기 때문에

이 객체를 빈으로 등록하면

BeanNameViewResolver로 뷰를 받을 수 있다고 생각했습니다.

그런데 아래와 같이 에러가 생겼고

갑자기 타임리프 뷰리졸버에서 에러가 생긴것 같아서

스프링 애플리케이션을 실행시키면서 뷰 리졸버 순서도 확인해보았는데

BeanNameViewResolver 가 ThymeleafViewResolver보다 앞이여서

이제 어떻게 이 문제를 해결해야 될지 막막합니다.

정답이 아니더라도 앞으로 어떻게 이 문제를 해결해 나가면 좋을 것 같은지 조언해주시면 감사하겠습니다.

답변 2

·

답변을 작성해보세요.

1

일단 이유는 0순위에 있는 ContentNegotiatingViewResolver 때문입니다. 그 뷰에 대해서는 나중에 좀 더 공부해 보시길 바랍니다.

문제를 해결하는 방법은 여러가지가 있는데 해당 요청 핸들러에서 문자열을 리턴하는게 아니라 해당 뷰 객체를 리턴하는 방법이 있습니다. 그러면 굳이 문자열로 해당 뷰 객체를 찾는 ViewResolver를 거치지 않아도 되며 개발자가 보기에도 직관적인 코드가 되기 때문에 저는 개인적으로 이 방법을 더 선호합니다만.. 

지금처럼 문자열을 리턴하고, ViewResolver를 사용해서 찾게 하고 싶다면 @GetMapping에 produces를 추가해서 CNVR이 이 요청에 대한 응답을 보여줄 뷰로 엑셀 뷰를 찾도록 알려줘야 합니다. 지금은 아무런 정보가 없어서 기본 뷰인 타임리프 뷰 리졸버를 사용한것으로 보이네요. 

@GetMapping(value = "/excel", produces = "application/vnd.ms-excel")

이런식으로 엑셀 뷰 헤더 정보를 추가해주면 찾아줄겁니다.

0

woody님의 프로필

woody

질문자

2019.07.19

감사합니다. ㅜ ㅜ 뷰리졸버에 대해서 좀 더 공부를 해봐야겠네요