작성
·
268
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