2014-03-01 41 views
-1

我的应用程序使用Spring Security,在启动过程中崩溃。跟踪应用程序的执行,我可以确认误差在方法onStartup从类MainWebAppInitializer发生:基于Spring Security的Web应用程序在启动过程中崩溃(NullPointerException)

public class MainWebAppInitializer implements WebApplicationInitializer { 

    /** 
    * Register and configure all Servlet container components necessary to power the web application. 
    */ 
    @Override 
    public void onStartup(final ServletContext sc) throws ServletException { 
     // Create the 'root' Spring application context 
     final AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); 
     root.scan("com.spring.web.config"); 

     // Manages the lifecycle of the root application context 
     sc.addListener(new ContextLoaderListener(root)); 

     // Handles requests into the application 
     final ServletRegistration.Dynamic appServlet = sc.addServlet("horariolivreapp", new DispatcherServlet(new GenericWebApplicationContext())); 
     appServlet.setLoadOnStartup(1); 
     final Set<String> mappingConflicts = appServlet.addMapping("/"); 
     if (!mappingConflicts.isEmpty()) { 
      throw new IllegalStateException("'appServlet' could not be mapped to '/' due " + "to an existing mapping. This is a known issue under Tomcat versions " + "<= 7.0.14; see https://issues.apache.org/bugzilla/show_bug.cgi?id=51278"); 
     } 
    } 

} 

更多specificly,在一个NullPointerException触发线

appServlet.setLoadOnStartup(1) 

发生错误。遵循它是我的配置文件,以供参考:

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    xsi:schemaLocation=" 

http://java.sun.com/xml/ns/javaee 

     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 

    <display-name>HorarioLivre</display-name> 

    <!-- Spring MVC --> 
    <servlet> 
     <servlet-name>horariolivreapp</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>horariolivreapp</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </context-param> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.spring.web.config</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Spring Security --> 
    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

horariolivreap-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.horariolivreapp.controller" /> 
    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 
</beans> 

webSecurityConfig.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xsi:schemaLocation=" 

http://www.springframework.org/schema/security 


http://www.springframework.org/schema/security/spring-security-3.1.xsd 


http://www.springframework.org/schema/beans 

     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

    <http use-expressions="true"> 
     <intercept-url pattern="/login*" access="isAnonymous()" /> 
     <intercept-url pattern="/**" access="isAuthenticated()"/> 

     <form-login 
     login-page='/form_login.html' 
     login-processing-url="/usuario_login.html" 
     default-target-url="/usuario_start.html" 
     authentication-failure-url="/form_login" 
     always-use-default-target="true"/> 

     <logout logout-success-url="/login.html" /> 

    </http> 
    <authentication-manager> 
     <authentication-provider> 
     <user-service> 
      <user name="user1" password="user1Pass" authorities="ROLE_USER" /> 
     </user-service> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

查看此文件,有人可以找到此问题的原因?

UPDATE 1 这是我的控制器(DispatcherServlet的)类:

package com.horariolivreapp.controller; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.ImportResource; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 

import com.horariolivreapp.core.Sessao; 
import com.horariolivreapp.data.UsuarioDAO; 
@Controller 
public class HorarioLivreController { 

    private Sessao sessao; 

    @RequestMapping("/cadastra_evento") 
    public ModelAndView cadastra_evento() { 
     return null; 
    } 
    @RequestMapping(value="/listagem_evento", method=RequestMethod.GET) 
    public ModelAndView listagem_evento() { 
     return null; 
    } 
    @RequestMapping("/cadastra_horario") 
    public ModelAndView cadastra_horario() { 
     return null; 
    } 
    @RequestMapping("/listagem_horario") 
    public ModelAndView listagem_horario() { 
     return null; 
    } 
    @RequestMapping("/cadastra_usuario") 
    public ModelAndView cadastra_usuario() { 
     return null; 
    } 
    @RequestMapping("/listagem_usuario") 
    public ModelAndView listagem_usuario() { 
     return null; 
    } 
    @RequestMapping("/cadastra_tipo") 
    public ModelAndView cadastra_tipo() { 
     return null; 
    } 
    @RequestMapping("/cadastra_campo") 
    public ModelAndView cadastra_campo() { 
     return null; 
    } 
    @RequestMapping("/cadastra_autorizacao") 
    public ModelAndView cadastra_autorizacao() { 
     return null; 
    } 
    @RequestMapping("/usuario_perfil") 
    public ModelAndView usuario_perfil() { 
     return null; 
    } 
    @RequestMapping("/usuario_config") 
    public ModelAndView usuario_config() { 
     return null; 
    } 
    @RequestMapping(value="/usuario_login", method=RequestMethod.POST) 
    public ModelAndView usuario_login(@RequestParam("j_username") String username, @RequestParam("j_password") String password) { 
     UsuarioDAO usuario = new UsuarioDAO(username, password); 
     if(usuario.getUsuario() != null) { 
      this.sessao = new Sessao(usuario.getUsuario()); 
     } 
     return new ModelAndView("usuario_start","usuario",usuario.getUsuario()); 
    } 
    @Configuration 
    @ImportResource({ "classpath:webSecurityConfig.xml" }) 
    public class SecSecurityConfig { 
     public SecSecurityConfig() { 
      super(); 
     } 
    } 
} 
+0

为什么在初始化程序和'web.xml'中复制初始化(servlet + listener)。任何具体的原因或者是一个错误?顺便说一句。这是空的理由 - http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#addServlet%28java.lang.String,%20java.lang.Class%29 –

+0

我只是请按照本文中的说明操作:http://www.javacodegeeks.com/2013/05/spring-security-login.html。我尝试从Web中删除初始化(servlet + listener)。xml,但现在应用程序被加载,但我收到一个错误** HTTP状态404 -/HorarioLivre/**,与此详细信息:**类型**状态报告, **消息**/HorarioLivre /,**说明**请求的资源不可用。 –

+0

你如何定义你的Spring上下文有点不清楚。不知道根配置(你的一些'@ Configuration')是否会加载'webSecurityConfig.xml'。但最重要的是,您正在使用空上下文初始化调度程序servlet,因此它将永远不会正确加载'horariolivreap-servlet.xml'。 –

回答

1

的NPE在这一点意味着appServlet为空,这反过来又意味着,sc.addServlet(...)返回null

addServlet的Javadoc这样说:

返回:可用于进一步配置这个servlet一个ServletRegistration对象,或者null如果ServletContext已经包含了与一个servlet的完整ServletRegistration给予servletName或者如果同一个servlet实例已经在同一个容器中注册与本或其他ServletContext

现在您正在实例化Servlet对象,因此它以前不能注册。但有可能是另一个Servlet具有相同的名称...这是问题的可能的直接原因。

而事实上,它看起来像你有已经通过声明它在web.xml文件中注册一个名为“horariolivreapp”的servlet。

+0

好吧,我如何对帕维尔说,我尝试从初始化程序和web.xml中删除初始化(servlet + listener)。从两种方式进行后,应用程序已加载,但我收到错误404(也在上面的答案中进行了描述)。 –