spring gradle bootrun 忽略 web xml / 自定义调度程序 servlet 配置 NoSuchBeanDefinitionException

Posted

技术标签:

【中文标题】spring gradle bootrun 忽略 web xml / 自定义调度程序 servlet 配置 NoSuchBeanDefinitionException【英文标题】:spring gradle bootrun ignores web xml / custom dispatcher servlet configuration NoSuchBeanDefinitionException 【发布时间】:2014-10-13 21:07:22 【问题描述】:

我正在尝试设置一个使用 Spring JDBC 模板的 Spring MVC 应用程序。我只有一个问题,Spring 似乎没有为 NamedParameterJdbcTemplate 获取我的 bean 配置。

web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     version="2.4"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
               http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        WEB-INF/desk-servlet.xml
    </param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<display-name>Desk</display-name>

<servlet>
    <servlet-name>desk</servlet-name>
    <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>desk</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

desk-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:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>
    <property name="url" value="jdbc:jtds:sqlserver://localhost:1433/desk_db;instance=SQLEXPRESS"/>
    <property name="username" value="user"/>
    <property name="password" value="pass"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

<mvc:resources mapping="/resources/**" location="/resources/"/>

<context:component-scan base-package="com.myapplication.desk.mvc, com.myapplication.desk.persistence, com.myapplication.desk.service"/>

<context:annotation-config/>

<mvc:annotation-driven/>
</beans>

在我的代码中,我实现了一个 DAO 类,用于处理我的应用程序的数据库层,它像这样连接 bean:

@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;

当我使用“gradlew - bootRun”测试我的应用程序时,我得到了这个异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate]
found for dependency: expected at least 1 bean which qualifies as autowire 
candidate for this dependency. Dependency annotations: 
@org.springframework.beans.factory.annotation.Autowired(required=true)

我已经制作了所有其他配置注释,这似乎很好。所以我有两个问题:

    如何在我的代码中定义这个 bean? 如何让 Spring 获取我的配置?

非常感谢任何提示!非常感谢您花时间阅读本文。

【问题讨论】:

Spring Boot 不会对您的 web.xml 或您的应用程序配置做任何事情。我建议你先看看 Spring Boot Reference Guide 以及它为你做了什么。基本上,您发布的内容,您可以删除所有内容,将数据源的属性放在application.properties 文件中,使用启动应用程序的 main 方法创建一个类。 Spring Boot 会为你配置好一切。 【参考方案1】:

解决你的问题

    删除您的 web.xml 删除您的desk-servlet.xml 添加 application.properties 创建一个可运行的类

1 和 2 是非常自我解释的。

src\main\resources 中创建一个包含数据源设置的 application.properties 文件。更多属性见this section in the reference guide和properties列表。

spring.datasource.url=jdbc:jtds:sqlserver://localhost:1433/desk_db;instance=SQLEXPRESS
spring.datasource.username=user
spring.datasource.password=pass

创建一个可运行的类来引导您的应用程序。

package com.myapplication.desk;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public static MyApplication 

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


现在要么运行这个类来引导你的应用程序,要么使用gradlew -bootRun。我更喜欢只运行这个类。

Spring Boot 将根据在类路径中检测到的内容来设置JdbcTemplateNamedParameterJdbcTemplate。它还将负责公开/resources,以便在网络上可用。这是由于添加了@EnableAutoConfiguration

我强烈建议阅读 Spring Boot Reference Guide 并查看 the samples

【讨论】:

以上是关于spring gradle bootrun 忽略 web xml / 自定义调度程序 servlet 配置 NoSuchBeanDefinitionException的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 导出属性不适用于 Spring 中的 gradle bootRun

并行启动多个 Gradle "spring-boot" 插件 "bootRun" 任务

spring bootRun 和 Angular buildWatch 使用 Gradle

Gradle > 如何停止使用 gradle bootRun 启动的 Spring Boot 应用程序?

使用 Spring Boot“bootRun”启动的应用程序在包含 Gradle Vaadin 插件时会导致 NoClassDefFoundError

尝试使用 gradle bootrun 编译并获取找不到 spring-boot-gradle-plugin:1.4.0.BUILD-SNAPSHOT