2017. 1. 16. 12:56ㆍetc/error
jeus.servlet.jsp.compiler.JspParseException: namespace must be specified for function
위 오류에 대해서 알아보자.
로컬에서 테스트 할 때 잘되던게 개발서버에 포팅하고나서 안되더라...
환경은 다음과 같다.
was : 로컬 : tomcat 7 개발서버 : jeus
spring 3.1 jdk 7
|
포팅 한 후 오류메시지는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 |
jeus.servlet.jsp.compiler.JspParseException: namespace must be specified for function : getToDate
at jeus.servlet.jsp.compiler.ELFunctionParser.parseFunction(ELFunctionParser.java:92)
at jeus.servlet.jsp.compiler.ELFunctionParser.parseFunction(ELFunctionParser.java:56)
at jeus.servlet.jsp.compiler.ELFunctionParser.parseFunction(ELFunctionParser.java:42)
at jeus.servlet.jsp.compiler.CodeGenerator.findFunctionStaticNames(CodeGenerator.java:839)
at jeus.servlet.jsp.compiler.ExpressionEvaluatorParser.accept(ExpressionEvaluatorParser.java:61)
at jeus.servlet.jsp.compiler.JspParser.parseJspPage(JspParser.java:1004)
at jeus.servlet.jsp.compiler.JspParser.parse(JspParser.java:658)
at jeus.servlet.jsp.compiler.JspParser.parse(JspParser.java:634)
at jeus.servlet.jsp.JspEngine.parseJsp(JspEngine.java:333)
at jeus.servlet.jsp.JspEngine.parseAndCompile(JspEngine.java:164)
at jeus.servlet.loader.JspReloader.getInstance(JspReloader.java:228)
at jeus.servlet.loader.ServletReloader.getServlet(ServletReloader.java:51)
at jeus.servlet.jsp.JspServletWrapper.executeServlet(JspServletWrapper.java:133)
at jeus.servlet.engine.RequestDispatcherImpl.processCommonRequestDispatcher(RequestDispatcherImpl.java:442)
at jeus.servlet.engine.RequestDispatcherImpl.doForward(RequestDispatcherImpl.java:213)
at jeus.servlet.engine.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:195)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:705)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:818)
at jeus.servlet.engine.ServletWrapper.executeServlet(ServletWrapper.java:242)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:141)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:93)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:124)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:93)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
at jeus.servlet.filter.FilterChainImpl.internalDoFilter(FilterChainImpl.java:124)
at jeus.servlet.filter.FilterChainImpl.doFilter(FilterChainImpl.java:93)
at jeus.servlet.engine.ServletWrapper.execute(ServletWrapper.java:204)
at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:217)
|
cs |
가장 첫줄에 힌트가 있다.
jeus.servlet.jsp.compiler.JspParseException: namespace must be specified for function : getToDate
getToDate 라는 함수의 이름을 지정해야 한다고? 음... 아마 못찾는것 같다.
getToDate 라는 함수는 custom tag lib 에 정의해놓은 함수이다.
1 |
${!empty dateDTO ? dateDTO.toDate : tu:getToDate() } |
cs |
jsp 에서 el 로 위와 같이 삼항연산자로 사용중이다.
( tu 는 커스텀 태그라이브러리 <%@ taglib prefix="tu" uri="tld/TsUtil.tld"%> 로 선언되어 있음)
local에서는 문제가 없었다.
커스텀 태그라이브러리 설정부터 java 파일, JSP 파일까지 모두 살펴봐도 함수를 못찾을 이유는 없었다.
getToDate를 사용하는 다른 페이지에서는 오류가 나지 않았다.
그런데 자세히 보니 삼항연산자에 콜론( : ) 이 2개가 있다.
순서를 바꾸어 보았다.
1 |
${empty dateDTO ? tu:getToDate() : dateDTO.toDate} |
cs |
이렇게 작성하니 오류가 없었다.
결론은 jeus 에서 jsp 파일을 빌드할 때 문제가 생긴것 같다.
el 에서 삼항연산자를 쓸 경우 태그라이브러리 사용에 대해서 주의할 필요가 있어 보인다.