Spring-Boot @Autowired 变量为空

Spring-Boot @Autowired variable is null

我正在尝试使用 Spring-boot class 中的 @Autowired 批注将存储库放入带有 @Service 批注的 class 中。但是,存储库显示为空。

相关代码如下:

@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 为空。

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

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

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

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

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

上使用它

选项 2:编码导入 class 创建另一个 Spring 应用程序

@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我会看看是否可行。

您的应用程序是一个普通的 Java 应用程序。它不是 Spring 启动应用程序。

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

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