2012. 9. 7. 10:02

에러 내용은 아래과 같았다.

 

1. SimpleFormController를 사용 시 xml혹은 생성자 등에 validator를 선언해주고

2. validator에 해당 validation을 걸어주며

3. message.properties에 그에 대한 메시지를 걸어주고

4. jsp에서 <spring:hasBindErrors name="command name" /> or <spring:bind path="command name" /> 으로 명시 후

5. 에러를 보여줄 위치에 <form:errors path="command name.해당 필드명" />

 

이렇게 순서에 맞게 작업을 했는데도 formBackingObject(get방식) 들어갈 때 부터 아래와 같은 예외가 발생해서 수십군데를 찾아봤지만 한국웹에서는 관련내용이 나오지 않았다.

역시 구글에서 찾아보니 classpath 문제거나 여러 spring 버전의 jar가 짬뽕되어 날 수 있는 에러라고 보곤 우리 프로젝트는 이런 경우는 아닐꺼야 하곤 2시간 더 삽질 후 안되겠어서 jar를 교체해봤더니 정상적으로 된다.

해당 프로젝트의 경우 2006년부터 지금까지 spring 프레임워크로 사용중이라 알게 모르게 버전이 꼬여있었던 것 같다.

혹시 본인과 같은 에러가 발생하는 경우 이걸보고 삽질을 하지 않기를..

 

추가적으로 validator에서 message.properties로 연결 시 대부분 아래와 같은 방법을 많이 사용한다

(하더라, 수십개의 정리된 블로그, 사이트등을 찾아봤지만 95%이상 이렇게 쓰고 있었다)

 

errors.rejectValue("topic", "required");

이렇게 쓴다면 5가지 경우로 사용되는 메시지 코드 순서가 있는데

required.commandName.topic

required.topic

required.java.lang.String

required

(여기에 required부분에 메시지 required.empty.topic로 사용할 수 있는게 있다)

 

대부분 errors.rejectValue("topic", "required"); 이와 같이 사용한다면

어떻게 message.properties에 명시 했는지 찾아봐야한다.(개발자마다 성격이 참 제각각이기 때문에)

유지보수할 때도 불편하기 때문에 본인은 2가지를 추천한다.

 

첫번재는 맨 처음에 사용되는 메시지 코드를 사용(required.commandName.topic)

 왜냐면 맨 처음에 사용되는 코드는 여러 분기 없이 바로 가져다가 사용하므로 시간 측면이 좋다.

(확실하진 않으며 그리 많은 속도에 해당 부분이 관여한다고는 장담할 수 없다.

 허나 최적화(튜닝)이란 작은 것이라도 하나하나 지켜가야 점차 발전한다고 믿기때문에..)

두번재는 직접 메시지 코드 풀네임을 명시하는 것이다.

 이는 개발자로 하여금 유지보수시 가독성을 높여준다.

 

최적화와 유지보수시 코드 가독성은 둘다 지키면 좋겟지만 그렇지 못하는 경우가 많으므로..

해당 프로젝트에 맞는, 또는 본인의 취향에 맞는 부분으로 선택해서 사용한다면

좀 더 성능적 측면이나 효율적인 유지보수를 진행할 수 있지 않을까 생각된다.

 

-----------------------------------------------------------------------------------------------------

2012. 9. 7 오전 9:41:05 org.apache.catalina.core.ApplicationDispatcher invoke
심각: Servlet.service() for servlet jsp threw exception
java.lang.IllegalAccessError: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(Ljava/lang/String;)Ljava/lang/Object; from class org.springframework.web.servlet.support.BindStatus
 at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:122)
 at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:161)
 at org.springframework.web.servlet.tags.form.ErrorsTag.shouldRender(ErrorsTag.java:138)
 at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:46)
 at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:90)
 at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)
 at org.apache.jsp.WEB_002dINF.jsp.community.form_jsp._jspService(form_jsp.java:208)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
 at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
 at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251)
 at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160)
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 EncodingFilter.doFilter(EncodingFilter.java:42)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
 at java.lang.Thread.run(Thread.java:619)
2012. 9. 7 오전 9:41:05 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet action threw exception
java.lang.IllegalAccessError: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(Ljava/lang/String;)Ljava/lang/Object; from class org.springframework.web.servlet.support.BindStatus
 at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:122)
 at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:161)
 at org.springframework.web.servlet.tags.form.ErrorsTag.shouldRender(ErrorsTag.java:138)
 at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:46)
 at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:90)
 at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)
 at org.apache.jsp.WEB_002dINF.jsp.community.form_jsp._jspService(form_jsp.java:208)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
 at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
 at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251)
 at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160)
 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
 at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
 at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 EncodingFilter.doFilter(EncodingFilter.java:42)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
 at java.lang.Thread.run(Thread.java:619)

-----------------------------------------------------------------------------------------------------

'Framework > spring' 카테고리의 다른 글

Spring Transaction(선언적) & iBatis 연동  (0) 2011.12.08
Spring viewResolver & tiles2  (2) 2011.07.18
spring IDE 의 강점 Beans Support  (0) 2010.08.23
Posted by silver0r