1 포팅중 애러발생
개발에 들어갈 프로젝트에 앞서 샘플코드를 작성해 개발서버에 포팅하려는 상황입니다. 빌드까지 전부 수행한 후 올렸더니 오 잘돌아간다 싶더니만 파일업로드 부분에서 애러가 떨어집니다..
뭐지..? 자바 컴파일 버전도 마췄고 URL경로도 전부 맞는데 무엇때문에 애러가 떨어지나..? 하고 찾아보니 다음과 같은 애러가 로그에 찍혀있습니다.
2014. 12. 9 오후 1:38:33 org.apache.catalina.core.ApplicationContext log
정보: Initializing Spring FrameworkServlet 'spring'
2014. 12. 9 오후 1:39:46 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet spring threw exception
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
at kr.acanet.controller.ApiController.previewItems(ApiController.java:266)
at kr.acanet.controller.ApiController$$FastClassBySpringCGLIB$$31f6f50d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
.....
우선은 이 애러가 발생한 지점의 코드입니다. 로그에서는 266번째 줄이지만 밑의 코드에서는 14번째 줄에서 애러가 터진상황입니다.
request에 getServletContent()라는 메소드가 없어서 나는 애러인거지요. 순간적으로 느낀게 지금 내가 포팅하려는 서버가 톰캣 몇버전이지? 생각해보니 아.. 6버전입니다. 톰캣6은 서블릿 2.5까지밖에 지원하지 않는데 지금의 코드는 서블릿 3.0에서부터 사용할 수 있는 코드이니 애러가 발생하게 된것이지요.
해결법을 구글신에게 여쭤보니 다음과 같은 답변을 찾을 수 있었습니다.
That method request.getServletContext()
was introduced in servlet 3.0. Make sure your container/library support that version.
edit: tomcat 6 only have servlet 2.5, see http://tomcat.apache.org/whichversion.html
it can be autowired: ServletContext and Spring MVC
public class Xxxx{
@Autowired
ServletContext context;
@RequestMapping(value = "/submit", method = RequestMethod.POST)
public String upload(UploadItem uploadItem, BindingResult result, HttpServletRequest request, HttpSession session) {
//some code here
String name = context.getRealPath("/pdf/" + filename);
...
"request.getServletContext() 메소드는 서블릿 3.0에서 소개되었습니다. 때문에 당신의 컨테이너 또는 라이브러리는 이것을 지원하는 버전이어야 합니다.
수정 : 톰캣 6은 servlet 2.5만 가지고 있습니다. http://tomcat.apache.org/whichversion.html
Spring MVC를 사용하고 있다면 autowired 어노테이션을 이용할 수 있습니다."
역시.. 물론 개발서버의 톰캣 버전을 올리는것이 최고이겠지만 지금은 시간이 없으니.. 차후에 톰캣 업그레이드 하고 위의 해결법대로 코딩하니 해결 됩니다.