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
和其他配置选项。
我正在尝试使用 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
和其他配置选项。