Spring的ResourceHttpRequestHandler使用NullPointerException返回500

时间:2013-12-09 16:26:46

标签: java spring maven spring-mvc

简短的问题:当我向spring mvc应用程序请求静态资源时,在org.apache.coyote.Response.setContentType(Response.java:452)的请求处理结束时抛出NullPointerException时出现500错误

很长的问题:

我在使用Netbeans开发的Maven项目中使用Spring 3.2.5。

这是我的pom.xml

http://maven.apache.org/xsd/maven-4.0.0.xsd“>     4.0.0

<groupId>net.pluce</groupId>
<artifactId>WorkTime</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>WorkTime</name>

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.5.RELEASE</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>1.3.2.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>

</dependencies>

<build>
    ... build infos 
</build>

我将我的应用程序配置为获取Restfuls网址,因此我的web.xml是:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
       instead of the default XmlWebApplicationContext -->
  <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
  </context-param>

  <!-- Configuration locations must consist of one or more comma- or space-delimited
       fully-qualified @Configuration classes. Fully-qualified packages may also be
       specified for component-scanning -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>net.pluce.worktime.config.AppConfig</param-value>
  </context-param>

  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>/WEB-INF/JSP/*</url-pattern>
  </servlet-mapping>

  <!-- Declare a Spring MVC DispatcherServlet as usual -->
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <init-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </init-param>
      <!-- Again, config locations must consist of one or more comma- or space-delimited
           and fully-qualified @Configuration classes -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>net.pluce.worktime.config.MvcConfig</param-value>
      </init-param>
  </servlet>

  <!-- map all requests for /app/* to the dispatcher servlet -->
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

我使用JspServlet技巧,因为如果不这样做,spring servlet会尝试处理我的调用,如“/WEB-INF/JSP/blabla.jsp”

我的文件夹结构:

    src 
        main
            java
                my/packages/to/config.MvcConfig
                my/packages/to/config.AppConfig
            webapp
                META-INF
                    context.xml
                WEB-INF
                    JSP
                        index.jsp
                    web.xml
                assets
                    css
                        myassets.css
                    js
                        jquery.js
            resources
                log4j.properties
        test

这是我的AppConfig类:

@Configuration
public class AppConfig {

    private String mongoUrl = "localhost";

    private String mongoDb = "worktime";

     public @Bean MongoFactoryBean mongo() {
          MongoFactoryBean mongo = new MongoFactoryBean();
          mongo.setHost(mongoUrl);
          return mongo;
     }

    public @Bean MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongo().getObject(), mongoDb);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }
}

我的MvcConfig课程:

@Configuration
@EnableWebMvc
@ComponentScan({"net.pluce.worktime"})
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver getViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/JSP/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
    }
}

我有一个映射到root的控制器并正确地为jsp提供服务:

@Controller
public class IndexCtrl {
    @Autowired
    private MongoOperations ops;

    @RequestMapping("/")
    public String renderIndex(Model mav){
        return "index";
    }
}

当我尝试获取我的资产时:GET http://localhost:8080/MyContextPath/assets/js/jquery.js,我收到500错误:

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

cause mère

java.lang.NullPointerException
    org.apache.coyote.Response.setContentType(Response.java:452)
    org.apache.catalina.connector.Response.setContentType(Response.java:806)
    org.apache.catalina.connector.ResponseFacade.setContentType(ResponseFacade.java:245)
    org.springframework.web.servlet.resource.ResourceHttpRequestHandler.setHeaders(ResourceHttpRequestHandler.java:240)
    org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:146)
    org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

阅读(相关部分)日志:

17:15:00,652 DEBUG DispatcherServlet:823 - DispatcherServlet with name 'dispatcher' processing GET request for [/WorkTime/assets/js/jquery.js]
17:15:00,657 TRACE DispatcherServlet:1088 - Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@4bbc3c6] in DispatcherServlet with name 'dispatcher'
17:15:00,658 DEBUG RequestMappingHandlerMapping:220 - Looking up handler method for path /assets/js/jquery.js
17:15:00,659 DEBUG RequestMappingHandlerMapping:230 - Did not find handler method for [/assets/js/jquery.js]
17:15:00,660 TRACE DispatcherServlet:1088 - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@4331fe97] in DispatcherServlet with name 'dispatcher'
17:15:00,660 TRACE BeanNameUrlHandlerMapping:127 - No handler mapping found for [/assets/js/jquery.js]
17:15:00,660 TRACE DispatcherServlet:1088 - Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@7418df8] in DispatcherServlet with name 'dispatcher'
17:15:00,660 DEBUG SimpleUrlHandlerMapping:169 - Matching patterns for request [/assets/js/jquery.js] are [/assets/**]
17:15:00,661 DEBUG SimpleUrlHandlerMapping:194 - URI Template variables for request [/assets/js/jquery.js] are {}
17:15:00,661 DEBUG SimpleUrlHandlerMapping:124 - Mapping [/assets/js/jquery.js] to HandlerExecutionChain with handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@60cf9880] and 1 interceptor
17:15:00,662 TRACE DispatcherServlet:1122 - Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@5d252d27]
17:15:00,662 TRACE DispatcherServlet:1122 - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@33b78b37]
17:15:00,662 DEBUG DispatcherServlet:912 - Last-Modified value for [/WorkTime/assets/js/jquery.js] is: -1
17:15:00,663 DEBUG ResourceHttpRequestHandler:173 - Trying relative path [js/jquery.js] against base location: ServletContext resource [/assets/]
17:15:00,674 DEBUG ResourceHttpRequestHandler:178 - Found matching resource: ServletContext resource [/assets/js/jquery.js]
17:15:00,674 DEBUG ResourceHttpRequestHandler:132 - Determined media type 'application/javascript' for ServletContext resource [/assets/js/jquery.js]
17:15:00,675 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@60cf9880]: java.lang.NullPointerException
17:15:00,676 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@60cf9880]: java.lang.NullPointerException
17:15:00,676 TRACE DispatcherServlet:1028 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@16fd089a
17:15:00,677 DEBUG DispatcherServlet:959 - Could not complete request
java.lang.NullPointerException
    at org.apache.coyote.Response.setContentType(Response.java:452)
    at org.apache.catalina.connector.Response.setContentType(Response.java:806)
    at org.apache.catalina.connector.ResponseFacade.setContentType(ResponseFacade.java:245)
    at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.setHeaders(ResourceHttpRequestHandler.java:240)
    at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:146)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
17:15:00,680 TRACE AnnotationConfigWebApplicationContext:332 - Publishing event in WebApplicationContext for namespace 'dispatcher-servlet': ServletRequestHandledEvent: url=[/WorkTime/assets/js/jquery.js]; client=[127.0.0.1]; method=[GET]; servlet=[dispatcher]; session=[C2D001FA38DB36BD6286C598E46652D2]; user=[null]; time=[38ms]; status=[failed: java.lang.NullPointerException]
17:15:00,681 TRACE AnnotationConfigWebApplicationContext:332 - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/WorkTime/assets/js/jquery.js]; client=[127.0.0.1]; method=[GET]; servlet=[dispatcher]; session=[C2D001FA38DB36BD6286C598E46652D2]; user=[null]; time=[38ms]; status=[failed: java.lang.NullPointerException]

我读到的内容:   - 我的请求由Spring调度程序servlet处理   - 请求被映射到ResourceHttpRequestHandler   - ResourceHttpRequestHandler在我的文件中找到匹配的资源   - 它确定了好的媒体类型“application / javascript”   - 写入Response时抛出NullPointerException。

我查看了Response.setContentType() method,发现没有什么值得NullPointerException。

提前致谢

0 个答案:

没有答案