@ImportResource无法正常运行

时间:2018-08-25 07:43:27

标签: java spring spring-boot mustache

我是Spring Boot的新手,我想实现一个简单的Web应用程序,该应用程序使用一些Mustache模板呈现UI。

我已经编写了一些Spring组件(控制器,DAO,服务),它们的包结构不同(不属于与Spring boor运行器类相同的子目录)。因此,我使用@ImportResource批注来声明spring配置。但是我的应用程序未读取任何配置文件。

有关更多详细信息,请参见下面的代码片段

  1. 项目结构:

enter image description here

并非如此,Spring引导应用程序启动程序类以软件包SpringPropertyReaderApplication编写。

ApplicationConfiguration类是在相同的分层包结构下编写的,该结构使用@ImportResource批注定义了更多配置。

  1. Spring启动应用程序启动器类。
  

打包com.example.launcher;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringPropertyReaderApplication {

  public static void main(String[] args) {


      ApplicationContext applicationContext = SpringApplication.run(SpringPropertyReaderApplication.class, args);

      System.out.println("------------------------------------------------");
      System.out.println("-----Printing Bean Definition Names ------------");
      System.out.println("------------------------------------------------");
      for (String name : applicationContext.getBeanDefinitionNames()) {
          System.out.println(name);
      }
      System.out.println("------------------------------------------------");
      System.out.println("--------------------END------------------------");
      System.out.println("------------------------------------------------");
  }
}
  1. 与我共享其他Spring配置文件位置的ApplicationConfiguration类。
  

package com.example.launcher.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(locations = {"classpath*:application-context.xml"})
public class ApplicationConfiguration {

  @Bean
  public String someDummyBean1() {
      return "someDummyBean1";
  }
}
  1. 未由容器加载的Spring应用程序配置。

在这里,我添加了组件扫描批注来扫描与Spring启动器类不在同一软件包中的服务和控制器。

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


  <context:component-scan
      base-package="com.example" />

  <bean id="xmlStringBean1" class="java.lang.String">
      <constructor-arg value="stringBean1" />
  </bean>

</beans>

我已经添加了代码以记录所有由Spring boot加载的bean名称。但是我没有找到任何名为“ xmlStringBean1”和“ myController”的bean。

还请注意,如果我将Rest控制器和其他类放在与Spring boot启动器类相同的包层次结构中,则此应用程序可以正常工作。

2 个答案:

答案 0 :(得分:1)

我认为您的Spring Boot应用程序未检测到带有@Configuration 的类,因为默认情况下,它将尝试在与主类相同或子包中查找Configuration类 。用SpringPropertyReaderApplication注释您的@ComponentScan,如下所示:

@SpringBootApplication
@ComponentScan(basePackageClasses = {ApplicationConfiguration.class})
public class SpringPropertyReaderApplication {
    // your code here
}

答案 1 :(得分:0)

因此,application-context.xml位于src/main/resources下的spring文件夹中。但是在ApplicationConfiguration.java中定义的@ImportResource批注尝试仅在根路径内对其进行扫描。因此,未检测到文件。

@ImportResource(locations = {"classpath*:application-context.xml"})

要替换为

@ImportResource(locations = {"classpath:spring/application-context.xml"}) . 

这将强制执行框架以在spring目录(从根级别开始)中搜索application-context.xml。