当前位置: 首页 > 知识库问答 >
问题:

Spring-Boot@自动加载变量为空

姜永贞
2023-03-14

我试图在Spring boot类中使用@Autowired注释将存储库放入一个用@Service注释的类中。但是,存储库显示为空。

以下是相关代码:

@Service
public class ImportLicenses {


    @Autowired
    private LicenseRepository licenseRepository;

   public static void main (String[] args) {
            ImportLicenses importLicenses = new ImportLicenses();
            importLicenses.listFiles("/Users/admin/Licenses/licenses");
    }



  private void processLicense (Path path) {


        try {
            count++;
            BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
            FileTime fileTime = attr.lastModifiedTime();

            Permission permission = new Permission(readLineByLineJava8(path.toFile().getAbsolutePath()));

            LicensePojo licensePojo = new LicensePojo(permission, path);


            Optional<License> licenseOptional = licenseRepository.findById(licensePojo.getId());

此时它会得到一个NPE,因为licenceReposity为空。

我可以使用此构造函数访问控制器类中的licenseRepository

public LicenseController(LicenseRepository licenseRepository,
                         UserRepository userRepository) {
    this.licenseRepository = licenseRepository;
    this.userRepository = userRepository;
}

但是,由于我直接在静态main方法中调用构造函数,这似乎不可用。将存储库放入此类的最佳方法是什么?

编辑:感谢您的回复。为了澄清这个问题,我试图将这个类拉入现有Spring Boot应用程序的结构中,而不是创建一个单独的类。

选项1:在UI上创建一个按钮或菜单选择,并创建一个新的控制器类来运行导入。这将是最简单的,但我不想在UI上有这样的功能。

选项2:对导入类进行编码,创建另一个Spring Application

@SpringBootApplication
public class ImportLicenses implements ApplicationRunner {

    private final Logger logger = LoggerFactory.getLogger(LicenseGenApplication.class);

    @SpringBootApplication
    public static void main() {
        main();
    }


    public static void main(String[] args) {

        SpringApplication.run(ImportLiceneses.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
 
        listFiles("/Users/admin//licenses");

    }

    public void listFiles(String path) {

        try {
            Files.walk(Paths.get(path))
                    .filter(ImportLicenses::test)
                    .forEach(p -> processLicense(p));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    ....

}

选项3-从现有应用程序创建一个不可执行的jar文件以在新应用程序中使用,以避免重复代码。

选项1是最快的,我不确定选项2是否有效,选项3我会看看它是否可行。

共有1个答案

贲绪
2023-03-14

您的应用程序是一个常见的Java应用程序。它不是Spring Boot应用程序。

你应该怎么做?制作一个Spring Boot应用程序。例如,在以下位置创建演示应用程序:https://start.spring.io/,将主类与演示应用程序中的主类进行比较,然后相应地调整主类。还可以将Maven或Gradle配置与演示应用程序的配置进行比较,并进行相应的调整。

至少,您的应用程序应该有一个注解SpringBootApplication。此外,它应该通过SpringApplication启动。运行(…) 。这是最低要求。根据需要,您可能需要使用EnableAutoConfiguration和其他配置选项。

 类似资料:
  • 从2.7.3版本开始,Dubbo会自动从约定key中读取配置,并将配置以Key-Value的形式写入到URL中。 支持的key有以下两个: dubbo.labels,指定一些列配置到URL中的键值对,通常通过JVM -D或系统环境变量指定。 增加以下配置: # JVM -Ddubbo.labels = "tag1=value1; tag2=value2" # 环境变量 DUBBO_LAB

  • If there are some filters that you wish to load on every template invocation, you can specify them using this variable and Smarty will automatically load them for you. The variable is an associative a

  • Spring引导加载属性失败。下面是我通过yaml文件使用的属性。 我得到的例外是这个 原因:java.lang.IllegalAccessException:Class org.apache.kafka.common.utils.utils无法访问带有“protected”修饰符的类org.springframework.kafka.support.serializer.JsonDeserial

  • 我在我的机器上导出了一些简单的数据库CRED作为ENV变量。 我试图将这些动态加载到spring boot的配置文件中,但没有成功。我开始相信这是因为应用程序在TomCat容器中运行,因此与机器环境变量隔离。 但是,它仍然被视为的纯文本。Spring Boot是否具有读取系统环境变量的能力?

  • 我想提供一个特定的Bean,以便这个Bean覆盖Spring Cloud AutoConfiguration类中的Bean。 我还尝试使用自动配置。但是甚至注释也被忽略。 我的配置类bean总是在KubernetesClientAutoConfiguration类中的bean之后实例化。因此,AutoConfiguration类不使用我的bean。 文档说:在任何时候,您都可以开始定义自己的配置,

  • 我在使用Composer设置类自动加载方面遇到了很多麻烦,在这一点上,我已经阅读并观看了数以百万计的参考资料 一些快速版本信息: PHP-v5。6.17 项目布局比较简单: “composer.json”当前包含以下内容: 每当我更改目录结构、重命名类或修改“composer.json”时,我都会运行: 我的目标是从“框架”中的“类”、“配置”和“模型”文件夹中自动加载所有类;“index.php