使用 Spring MVC 运行 Spring Boot 时引发空指针异常

Posted

技术标签:

【中文标题】使用 Spring MVC 运行 Spring Boot 时引发空指针异常【英文标题】:Nullpointer exception thrown when running Sprint Boot with Spring MVC 【发布时间】:2018-04-21 18:51:07 【问题描述】:

我正在使用 spring boot 构建 spring mvc 项目,但我无法启动我的 web 应用程序。我已经遵循了几个教程,但无法弄清楚。我可以使用 spring boot 启动我的应用程序,但是当我添加 Spring mvc 时,它开始抛出错误。我收到以下错误

java.lang.NullPointerException: null 在 org.springframework.core.BridgeMethodResolver.findBridgedMethod(BridgeMethodResolver.java:60) 在 org.springframework.beans.GenericTypeAwarePropertyDescriptor.(GenericTypeAwarePropertyDescriptor.java:70) 在 org.springframework.beans.CachedIntrospectionResults.buildGenericTypeAwarePropertyDescriptor(CachedIntrospectionResults.java:366) 在 org.springframework.beans.CachedIntrospectionResults.(CachedIntrospectionResults.java:302) 在 org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:189) 在 org.springframework.beans.BeanUtils.getPropertyDescriptors(BeanUtils.java:354) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.getNames(PropertiesConfigurationFactory.java:288) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:269) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.bindToSpringApplication(ConfigFileApplicationListener.java:241) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.postProcessEnvironment(ConfigFileApplicationListener.java:197) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:182) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:168) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) 在 org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74) 在 org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54) 在 org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:325) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:296) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 在 com.azzimov.search.BootStarter.StartApplication.main(StartApplication.java:17) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:527) 在 java.lang.Thread.run(Thread.java:745) [警告] java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:527) 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.NullPointerException 在 org.springframework.core.BridgeMethodResolver.findBridgedMethod(BridgeMethodResolver.java:60) 在 org.springframework.beans.GenericTypeAwarePropertyDescriptor.(GenericTypeAwarePropertyDescriptor.java:70) 在 org.springframework.beans.CachedIntrospectionResults.buildGenericTypeAwarePropertyDescriptor(CachedIntrospectionResults.java:366) 在 org.springframework.beans.CachedIntrospectionResults.(CachedIntrospectionResults.java:302) 在 org.springframework.beans.CachedIntrospectionResults.forClass(CachedIntrospectionResults.java:189) 在 org.springframework.beans.BeanUtils.getPropertyDescriptors(BeanUtils.java:354) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.getNames(PropertiesConfigurationFactory.java:288) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:269) 在 org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.bindToSpringApplication(ConfigFileApplicationListener.java:241) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.postProcessEnvironment(ConfigFileApplicationListener.java:197) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:182) 在 org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:168) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) 在 org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) 在 org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74) 在 org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54) 在 org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:325) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:296) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 在 com.azzimov.search.BootStarter.StartApplication.main(StartApplication.java:17) ... 6 更多

我的 pom.xml 是

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>

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


    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.1.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.0.1.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>1.5.8.RELEASE</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>azzimov-search</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
      </plugin>

      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>

    </plugins>

    <resources>
      <resource>
        <directory>src/clients</directory>
      </resource>
    </resources>
  </build>

我的 web.xml 是

<webapp>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/web-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/gw/*</url-pattern>
  </servlet-mapping>
</web-app>

我的 web-config.xml 是

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd ">

    <mvc:annotation-driven />
    <context:component-scan base-package="com.project.book" />
</beans>

【问题讨论】:

您将 Spring 5 与支持 Spring 4 的 Spring boot 1.5 混合使用,这可能不兼容,并且您的操作方式会遇到冲突的版本(因为您将同时使用 5.0 和 4.3类路径)。接下来,您将通过包含您自己的 web.xml 和调度程序 servlet 加载来非常努力地不使用 Spring boot。 【参考方案1】:

您正在尝试将 Spring Boot 1.5 与 Spring 5 混合使用。这不会以这种方式工作,因为它们不兼容。如果你真的需要 Spring Framework 5,你应该使用 Spring Boot 2.x starter parent。

根据您的需要,您可以使用下面的 pom.xml 并将 1.5.8.RELEASE 更改为 2.0.0.M5,或者保持原样。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
<build>
    <finalName>azzimov-search</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

    </plugins>

    <resources>
        <resource>
            <directory>src/clients</directory>
        </resource>
    </resources>
</build>

请注意,我从您的依赖项中删除了版本,因此它们取自父启动器。

另外,删除您的 web.xmlweb-config.xml,因为它们对于 Spring Boot 不是必需的。而是在你的根包中创建一个类(大概是 com.project 或 com.project.book):

@SpringBootApplication
public class BookApp 

    public static void main(String[] args) 
         SpringApplication.run(BookApp.class, args);
    

【讨论】:

【参考方案2】:

从异常来看,它显然是一个依赖问题。您可以尝试使用最新版本的spring-boot 代替1.5.8.RELEASE 吗?

【讨论】:

【参考方案3】:

不要明确指定spring mvc或core版本,会自动取1.5.8的兼容版本。RELEASE spring boot。

【讨论】:

这个解决方案对我有用,无需升级到 spring-boot 2

以上是关于使用 Spring MVC 运行 Spring Boot 时引发空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc的运行原理是啥,m代表啥,v代表啥,v包含些啥,m包含些啥??

Spring Mvc 用Demo去学习

Spring MVC @JsonView使用详解

保护spring mvc和hibernate的最佳实践

在 spring-boot 项目中使用 spring mvc xml 项目

使用IDEA搭建一个Spring + Spring MVC 的Web项目(零配置文件)