涉及回调时,我对使用 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。实现这一目标的推荐方法是什么?
我可以用@Configuration创建一个工厂,并让一个方法为每个请求返回一个新的CallbackImpl bean
也许我可以从 BaseRepository 中删除 Autowired,并通过服务传入 BaseRepository -> 这是一个好的设计吗?即 Repository 应该只在 Service 中定义,并且 Service 在需要时使用 helper 类传递 Repository bean?
将 CallbackImpl 声明为原型作用域。我不清楚我将如何使用这种方法每次使用不同类型的 T 调用创建新实例。
也许我可以为要保存在数据库表中的 N 个实体创建 N 个存储库和 N 个服务。并且还有 N 个控制器,所以整个问题都被消除了,但这看起来像重复了很多类似的代码,如果我所做的只是保存不同类型的实体,如员工、承包商、主席等。即不相关的实体。
以某种方式使用 EntityManger 来持久化不同的实体
或者这完全是疯狂的,并且有更好的方法使用更好或更简单的设计来获得我想要的东西?