Spring Boot 多模块项目
Springboot multimodule project
我正在尝试获得一个干净的 springboot maven 多模块项目。
我正在使用 springboot 2.0.1.RELEASE
我想实现的是类似这样的:SpringBootMultipleMavenModules
我遇到的问题是我希望能够在任何模块中注入我的依赖项。
例如在此 class 中:DBSeeder.java 如下所示:
private HotelRepository hotelRepository;
public DbSeeder(HotelRepository hotelRepository){
this.hotelRepository = hotelRepository;
}
..
我想改用:
@Autowired
private HotelRepository hotelRepository;
应用程序 class 如下所示:
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"rc"})
@EntityScan(basePackages = {"rc"})
@ComponentScan(basePackages = {"rc"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
任何可以 link 我解决问题的想法都将受到欢迎。
查看您的代码,您不能 Autowire
一个 Hotel
bean,因为它没有正确注册。
您需要在其中添加 @Component
才能将其注入 https://github.com/IDCS1426/SpringBootMultipleMavenModules/blob/master/persistence/src/main/java/rc/persistence/DbSeeder.java#L21
此外,该项目永远不会编译,因为您要添加一个不存在的模块:https://github.com/IDCS1426/SpringBootMultipleMavenModules/blob/master/pom.xml#L14。您需要删除它 :).
说了这么多,我觉得你试图注入这样的 Entity
的方式很奇怪,但这不是这个问题的一部分。
通过这样做,代码编译得很好。
工作解决方案可用 here。实体中缺少 @Component
。
显然,bean 不应该像这里那样注入,而是实例化(例如 marriot = new Hotel("Marriot", 5, true);
)并通过 save
方法(或 saveAll
用于集合)持久化
仅为初始化目的注入实体是错误的,不会起作用:
每个酒店都将重复使用相同的实例。
@Autowired
private Hotel marriot, ibis, goldenTulip;
@Override
public void run(String... strings) throws Exception {
marriot.setName("Marriot");
marriot.setClassification(5);
marriot.setOpen(true);
ibis.setName("Ibis");
ibis.setClassification(3);
ibis.setOpen(false);
goldenTulip.setName("Golden Tulip");
goldenTulip.setClassification(4);
goldenTulip.setOpen(true);
List<Hotel> hotels = new ArrayList<>();
hotels.add(marriot);
hotels.add(ibis);
hotels.add(goldenTulip);
this.hotelRepository.saveAll(hotels);
}
将导致一个实体持续存在,因为所有 3 家酒店都是同一个实例。因此,http://localhost:8080/hotels 将 return:
[{"id":1,"name":"Golden Tulip","classification":4,"open":true}]
虽然实例化,
@Override
public void run(String... strings) throws Exception {
marriot = new Hotel("Marriot", 5, true);
ibis = new Hotel("Ibis", 3, false);
goldenTulip = new Hotel("Golden Tulip", 4, true);
List<Hotel> hotels = new ArrayList<>();
hotels.add(marriot);
hotels.add(ibis);
hotels.add(goldenTulip);
this.hotelRepository.saveAll(hotels);
}
它会 return 3 个实体:
[{"id":1,"name":"Marriot","classification":5,"open":true},{"id":2,"name":"Ibis","classification":3,"open":false},{"id":3,"name":"Golden Tulip","classification":4,"open":true}]
这正是我想在这里看到的,但忘记将 @Component
添加到实体 class。绝不能那样做!
编辑:
尝试这样做的原因是使用了服务层:
public interface NoteService {
List<Note> loadAll();
}
@Service
public class NoteServiceImpl implements NoteService {
@Autowired
private NoteRepository noteRepository;
@Override
public List<Note> loadAll() {
return noteRepository.findAll();
}
}
最终在运行时失败,Note
不是托管 bean。
我正在尝试获得一个干净的 springboot maven 多模块项目。 我正在使用 springboot 2.0.1.RELEASE
我想实现的是类似这样的:SpringBootMultipleMavenModules
我遇到的问题是我希望能够在任何模块中注入我的依赖项。
例如在此 class 中:DBSeeder.java 如下所示:
private HotelRepository hotelRepository;
public DbSeeder(HotelRepository hotelRepository){
this.hotelRepository = hotelRepository;
}
..
我想改用:
@Autowired
private HotelRepository hotelRepository;
应用程序 class 如下所示:
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"rc"})
@EntityScan(basePackages = {"rc"})
@ComponentScan(basePackages = {"rc"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
任何可以 link 我解决问题的想法都将受到欢迎。
查看您的代码,您不能 Autowire
一个 Hotel
bean,因为它没有正确注册。
您需要在其中添加 @Component
才能将其注入 https://github.com/IDCS1426/SpringBootMultipleMavenModules/blob/master/persistence/src/main/java/rc/persistence/DbSeeder.java#L21
此外,该项目永远不会编译,因为您要添加一个不存在的模块:https://github.com/IDCS1426/SpringBootMultipleMavenModules/blob/master/pom.xml#L14。您需要删除它 :).
说了这么多,我觉得你试图注入这样的 Entity
的方式很奇怪,但这不是这个问题的一部分。
通过这样做,代码编译得很好。
工作解决方案可用 here。实体中缺少 @Component
。
显然,bean 不应该像这里那样注入,而是实例化(例如 marriot = new Hotel("Marriot", 5, true);
)并通过 save
方法(或 saveAll
用于集合)持久化
仅为初始化目的注入实体是错误的,不会起作用: 每个酒店都将重复使用相同的实例。
@Autowired
private Hotel marriot, ibis, goldenTulip;
@Override
public void run(String... strings) throws Exception {
marriot.setName("Marriot");
marriot.setClassification(5);
marriot.setOpen(true);
ibis.setName("Ibis");
ibis.setClassification(3);
ibis.setOpen(false);
goldenTulip.setName("Golden Tulip");
goldenTulip.setClassification(4);
goldenTulip.setOpen(true);
List<Hotel> hotels = new ArrayList<>();
hotels.add(marriot);
hotels.add(ibis);
hotels.add(goldenTulip);
this.hotelRepository.saveAll(hotels);
}
将导致一个实体持续存在,因为所有 3 家酒店都是同一个实例。因此,http://localhost:8080/hotels 将 return:
[{"id":1,"name":"Golden Tulip","classification":4,"open":true}]
虽然实例化,
@Override
public void run(String... strings) throws Exception {
marriot = new Hotel("Marriot", 5, true);
ibis = new Hotel("Ibis", 3, false);
goldenTulip = new Hotel("Golden Tulip", 4, true);
List<Hotel> hotels = new ArrayList<>();
hotels.add(marriot);
hotels.add(ibis);
hotels.add(goldenTulip);
this.hotelRepository.saveAll(hotels);
}
它会 return 3 个实体:
[{"id":1,"name":"Marriot","classification":5,"open":true},{"id":2,"name":"Ibis","classification":3,"open":false},{"id":3,"name":"Golden Tulip","classification":4,"open":true}]
这正是我想在这里看到的,但忘记将 @Component
添加到实体 class。绝不能那样做!
编辑: 尝试这样做的原因是使用了服务层:
public interface NoteService {
List<Note> loadAll();
}
@Service
public class NoteServiceImpl implements NoteService {
@Autowired
private NoteRepository noteRepository;
@Override
public List<Note> loadAll() {
return noteRepository.findAll();
}
}
最终在运行时失败,Note
不是托管 bean。