Lang/Freemarker
[Tiles + FreeMarker] Could not resolve view with name 'wildcard.xxx' in servlet with name 'dispatcherServlet' 오류 조치
호형
2022. 3. 10. 14:46
Freemarker를 Tiles와 같이 써야하는 상황이 생겼다. 그래서 Tiles + Jsp 하던것처럼 tiles-layout.xml (tiles 구성 파일)을 설정을 했더니 정상적으로 동작하지 않는다. 다음과 같은 오류가 발생하였다.
[14:34:13.723][ERROR][org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet].log:line175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Could not resolve view with name 'freemarker.hello' in servlet with name 'dispatcherServlet'] with root cause
javax.servlet.ServletException: Could not resolve view with name 'freemarker.hello' in servlet with name 'dispatcherServlet'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1377)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1142)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
dispatcherServlet이 정의한 tiles definition을 찾아가지 못하는 문제였다. tiles definition은 다음과 같다.
<definition name="freemarker.*" extends="main" templateType="freemarker">
<put-attribute name="contents" value="/templates/freemarker/{1}.ftl" />
</definition>
Controller에서 예를들면 freemarker.hello 라는 리턴값을 주면 위에서 정의한 freemarker.* 으로 매핑이 되어져서 /templates/freemarker/hello.ftl 을 호출해야 하는데 위와 같이 freemarker.hello 라는 definition을 못찾고 있다.
다른게 문제가 아니라 바로 * (wildcard) 인식의 문제였다. 필자가 알기로는 tiles 2.x 에서는 wildcard를 사용하기 위해 prefix로 WILDCARD: 를 붙여줘야 하는걸 알고 있었고 3.x를 사용하고 있는 지금은 전혀 이런 표현식을 사용하지 않아도 wildcard 처리가 되었었는데 FreeMarker와 붙여서 쓰니 제대로 인식이 되지 않았다. 왜 3.x에서 이걸 붙여야 인식이 되는지 정확하게 파악은 못했지만 어쨌든 WILDCARD: 를 prefix로 쓰면 잘 된다. 다음과 같이 쓰면 된다.
<definition name="WILDCARD:freemarker.*" extends="main" templateType="freemarker">
<put-attribute name="contents" value="/templates/freemarker/{1}.ftl" />
</definition>
끝!