jeus.servlet.jsp.compiler.JspParseException: namespace must be specified for function

2017.01.16 12:56etc/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 에서 삼항연산자를 쓸 경우 태그라이브러리 사용에 대해서 주의할 필요가 있어 보인다.