【发布时间】:2021-08-02 20:58:21
【问题描述】:
动态父控制器
@CrossOrigin("*")
public abstract class RealtimeController<T> {
public abstract RealtimeService<T> getService();
@PostMapping(value = "/find")
public ResponseEntity<Iterable<T>> find(@RequestBody T entity) {
return ResponseEntity.ok(getService().findAllByKey(entity));
}
}
动态服务
public abstract class RealtimeService<T> {
public abstract RealtimeRepository<T> getRepository();
public Iterable<T> findAllByKey(T entity) {
return getRepository().findAll(
Example.of(
entity,
ExampleMatcher.matching().withIgnorePaths("_class"))
);
}
}
儿童控制器1
@Api(tags = "Child1")
@RestController
@RequestMapping("/api/v1/child1")
@Slf4j
public class Child1Controller extends RealtimeController<Child1> {
@Autowired
private Child1Service child1Service;
@Override
public RealtimeService<Child1> getService(){
return child1Service;
}
}
儿童控制器2
@Api(tags = "Child2")
@RestController
@RequestMapping("/api/v1/child2")
@Slf4j
public class Child2Controller extends RealtimeController<Child2> {
@Autowired
private Child2Service child2Service;
@Override
public RealtimeService<Child2> getService(){
return child2Service;
}
}
问题1:
我有 10 个这样的子控制器。有没有办法从一些配置动态创建它们?每个子控制器之间的唯一区别是模型、标签和端点。我的想法是从属性文件中读取这些配置并以某种方式动态生成这些控制器。有可能吗?
application.yaml
controllers:
- name: Child1
endpoint: /api/v1/child1
model: Child1
- name: Child2
endpoint: /api/v1/child2
model: Child2
问题2:
还有没有更好的方法可以在不重复代码的情况下达到类似的效果?
【问题讨论】:
-
findAllByKey的签名是什么? -
编辑了我的问题@talex
-
我很好奇它是如何工作的。
find(@RequestBody T entity)编译后会变成find(@RequestBody Object entity)。可能是一些spring魔术?
标签: java spring spring-boot generics