异常:java.lang.NoSuchMethodError

4

我正在尝试将PDF文件上传到服务器。我正在使用以下代码块放入控制器:

 @RequestMapping(value = /submit, method = RequestMethod.POST)
 public String upload(UploadItem uploadItem, BindingResult result, HttpServletRequest request, HttpSession session) {

   //some code here

   String name = request.getServletContext().getRealPath("/pdf/" + filename);
   File dest = new File(name);
   try {
        file.transferTo(dest);
   }catch(Exception e){
        System.err.println(e);
   }

   return "redirect:/details";

我这样做是为了将PDF存储到PDF文件中。在我的本地主机上工作正常,但当我在服务器上执行时,会出现以下异常:
exception

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
frontend.controller.EsteemRatingsController.handleFormUpload(EsteemRatingsController.java:113)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

如果我在控制器类中删除提供的行,它就能正常工作(当然不会上传pdf)。有人可以帮我解决这个问题吗?

你使用的是哪个Web容器?看起来你正在运行一些老旧的东西。 - Maurício Linhares
1个回答

21

该方法request.getServletContext()是在servlet 3.0中引入的。请确保您的容器/库支持该版本。

编辑:Tomcat 6仅支持servlet 2.5,请参见http://tomcat.apache.org/whichversion.html

它可以被自动装配:ServletContext和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);
...

那么,除了这种方法之外,我可以使用哪种方法来得到 Apache 6.0.24 的支持? - Nick Robertson
Spring能为您注入ServletContext吗?我没有尝试过,但我猜它可以。 - J-16 SDiZ
非常感谢您的回复和时间。我在网上看到它是可以的,但我对这一切都很陌生,无法理解。您能帮助我吗? - Nick Robertson
1
只需将ServletContext添加到您的方法签名中:public String upload(UploadItem uploadItem, BindingResult result, HttpServletRequest request, HttpSession session, ServletContext ctx) {,Spring就会为您完成魔法。 - J-16 SDiZ
再次感谢您,但是出现了一个问题。ServletContext是一个接口,所以我遇到了一个错误,它说“无法实例化bean类[javax.servlet.ServletContext]:指定的类是一个接口”。 - Nick Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接