使用 Spring boot 设计类,使用泛型回调的 JPA

问题描述 投票:0回答:0

涉及回调时,我对使用 Spring boot 和 JPA 的设计感到困惑。

例子:

Controller 将调用 Service 类并传入 T 的值,即我们示例中的 Employee:

@Controller
public class Controller1{
 
 @Autowired
 Service1 service1;

 @RequestMapping("/employee")
  public ResponseEntity<Object> employees(Request request){
    //Since employee is called I know that T should be of type Employee
    service1.runService(new Employee()); //I want to pass the type T as 
                                       //Employee, so that in the 
                                       //database all Employees can be saved
  }


}

我有一个服务:

//Controller will call this service and pass in T type
@Service
public class Service1{
  @Autowired
  Dependency1 dependency1;

 //@Autowire CallbackImpl -> this won't work because I need to create a new 
 //                          instance of type T for each different request from 
 //                            controller


public void runService(T t){
//CallbackImpl<Employee> callbackImpl= new CallbackImpl<>();-> this won't work because 
                                       //           it is not managed by Spring
                                       //           and the Repository bean 
                                       //           throws null pointer exception
  
   //Here I want to invoke the callbackImpl<T> class and specify the type T.. 
   // ..(which will be  an Entity type)
  
  ThirdPartyClass.get(callbackImpl) // callbackImpl is of type T (i.e Employee 
                                    // in this example)
 }
}

ThirdPartyClass.get() 方法提供了一个 ITirdPartyCallback 接口。

我的类 CallbackImpl 实现了这个接口,获取值并将其保存到数据库中,如下所示:

CallbackImpl<T> implements IThirdPartyCallback{
 
@Autowired
BaseRepository<T, Long> baseRepository // The sub-class EmployeeRepository 
                                       //..that 
                                      //..implements BaseRepository is called 
                                      //..based on type T

@Override
public void callback(String result){
// convert result to List<T> type, in this example T is Employee

baseRepository.saveAll(listOfResultsOfTypeT);  //in this result will be converted to List<T> 
                                 //and saved. In this example result will be 
                                 // List<Employee>
}
  }

我需要 CallbackImpl 的多个实例/bean。实现这一目标的推荐方法是什么?

  1. 我可以用@Configuration创建一个工厂,并让一个方法为每个请求返回一个新的CallbackImpl bean

  2. 也许我可以从 BaseRepository 中删除 Autowired,并通过服务传入 BaseRepository -> 这是一个好的设计吗?即 Repository 应该只在 Service 中定义,并且 Service 在需要时使用 helper 类传递 Repository bean?

  3. 将 CallbackImpl 声明为原型作用域。我不清楚我将如何使用这种方法每次使用不同类型的 T 调用创建新实例。

  4. 也许我可以为要保存在数据库表中的 N 个实体创建 N 个存储库和 N 个服务。并且还有 N 个控制器,所以整个问题都被消除了,但这看起来像重复了很多类似的代码,如果我所做的只是保存不同类型的实体,如员工、承包商、主席等。即不相关的实体。

  5. 以某种方式使用 EntityManger 来持久化不同的实体

或者这完全是疯狂的,并且有更好的方法使用更好或更简单的设计来获得我想要的东西?

java spring-boot design-patterns spring-data-jpa callback
© www.soinside.com 2019 - 2024. All rights reserved.