如何正确使用休息控制器中的工作单元?
How to use unit of work in rest controller properly?
public interface CourseRepo extends CrudRepository<Course, Long> {
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UnitOfWork {
CourseRepo courses;
StudentRepository students;
StudyProgramRepository studyPrograms;
StudySchemeRepo studySchemes;
FeeStructureRepository feeStructures;
}
@RestController
public class TestController {
@Autowired
UnitOfWork uow;
@GetMapping("/addcr")
public String addCourse() {
Course cr = new Course();
cr.setTitle("DingDong course");
uow.getCourses().save(cr);
return "course Added..!!" ;
}
APPLICATION FAILED TO START
***************************
Description:
Field uow in com.srs.TestController required a bean of type 'com.srs.uow.UnitOfWork' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.srs.uow.UnitOfWork' in your configuration.
如果我删除自动装配并添加一个 bean
@RestController
public class TestController {
@Bean
public UnitOfWork uow() {
return new UnitOfWork();
}
@GetMapping("/addcr")
public String addCourse() {
Course cr = new Course();
cr.setTitle("DingDong course");
uow().getCourses().save(cr);
return "course Added..!!" ;
}
java.lang.NullPointerException: 无法调用“com.srs.jpa.CourseRepo.save(对象)”
因为“com.srs.uow.UnitOfWork.getCourses()”的return值为空
我尝试了自动装配,在这种情况下我如何正确使用自动装配或 bean?
错误消息给出了答案。
Field uow in com.srs.TestController required a bean of type 'com.srs.uow.UnitOfWork' that could not be found.
spring 正在搜索 UnitOfWork 类型的 bean。您必须将此 class 添加到 spring 启动的应用程序上下文中。要完成此操作,如果您使用 lombok,则必须使用 @bean 或 @Data 注释 class UnitOfWork。
之后 spring 应用程序可以找到 Class UnitOfWork 并自动连接它。
您的 class 需要使用 @Component 注释才能通过 @Autowired 注释与 DI 提供程序一起使用
出于同样的原因,您 class 的每个存储库都需要使用 @Autowired
进行注释
由于 UnitOfWork(在 JPA 上下文中有点误导的名称)自动装配数据存储库,它必须是 Spring Bean 本身。
最简单和最常见的方法是使用注释 @Service
、@Component
或 @Bean
之一来注释 class,具体取决于 class。还有其他方法,例如您使用的方法级别的@Bean
。
要使用完全初始化的 bean,您需要在要使用它的地方自动装配它,而不是调用创建方法。例如。在您的示例中调用 uow()
,绕过 Spring Bean 机制并创建一个尚未完全初始化的新实例(因此 NullPointerException)。
通常,bean 作为字段自动装配,有时它们在 mehtod 参数中自动装配(尤其是在同一 class 的方法级别上使用 @Bean 时)。
例如
@Component
@Getter
@RequiredArgsConstructor
public class UnitOfWork {
private final CourseRepo courses;
private final StudentRepository students;
private final StudyProgramRepository studyPrograms;
private final StudySchemeRepo studySchemes;
private final FeeStructureRepository feeStructures;
}
public interface CourseRepo extends CrudRepository<Course, Long> {
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UnitOfWork {
CourseRepo courses;
StudentRepository students;
StudyProgramRepository studyPrograms;
StudySchemeRepo studySchemes;
FeeStructureRepository feeStructures;
}
@RestController
public class TestController {
@Autowired
UnitOfWork uow;
@GetMapping("/addcr")
public String addCourse() {
Course cr = new Course();
cr.setTitle("DingDong course");
uow.getCourses().save(cr);
return "course Added..!!" ;
}
APPLICATION FAILED TO START
***************************
Description:
Field uow in com.srs.TestController required a bean of type 'com.srs.uow.UnitOfWork' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.srs.uow.UnitOfWork' in your configuration.
如果我删除自动装配并添加一个 bean
@RestController
public class TestController {
@Bean
public UnitOfWork uow() {
return new UnitOfWork();
}
@GetMapping("/addcr")
public String addCourse() {
Course cr = new Course();
cr.setTitle("DingDong course");
uow().getCourses().save(cr);
return "course Added..!!" ;
}
java.lang.NullPointerException: 无法调用“com.srs.jpa.CourseRepo.save(对象)” 因为“com.srs.uow.UnitOfWork.getCourses()”的return值为空
我尝试了自动装配,在这种情况下我如何正确使用自动装配或 bean?
错误消息给出了答案。
Field uow in com.srs.TestController required a bean of type 'com.srs.uow.UnitOfWork' that could not be found.
spring 正在搜索 UnitOfWork 类型的 bean。您必须将此 class 添加到 spring 启动的应用程序上下文中。要完成此操作,如果您使用 lombok,则必须使用 @bean 或 @Data 注释 class UnitOfWork。 之后 spring 应用程序可以找到 Class UnitOfWork 并自动连接它。
您的 class 需要使用 @Component 注释才能通过 @Autowired 注释与 DI 提供程序一起使用
出于同样的原因,您 class 的每个存储库都需要使用 @Autowired
进行注释由于 UnitOfWork(在 JPA 上下文中有点误导的名称)自动装配数据存储库,它必须是 Spring Bean 本身。
最简单和最常见的方法是使用注释 @Service
、@Component
或 @Bean
之一来注释 class,具体取决于 class。还有其他方法,例如您使用的方法级别的@Bean
。
要使用完全初始化的 bean,您需要在要使用它的地方自动装配它,而不是调用创建方法。例如。在您的示例中调用 uow()
,绕过 Spring Bean 机制并创建一个尚未完全初始化的新实例(因此 NullPointerException)。
通常,bean 作为字段自动装配,有时它们在 mehtod 参数中自动装配(尤其是在同一 class 的方法级别上使用 @Bean 时)。
例如
@Component
@Getter
@RequiredArgsConstructor
public class UnitOfWork {
private final CourseRepo courses;
private final StudentRepository students;
private final StudyProgramRepository studyPrograms;
private final StudySchemeRepo studySchemes;
private final FeeStructureRepository feeStructures;
}