如何正确使用休息控制器中的工作单元?

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;
}