【问题标题】:Create repeatative springboot controllers from configuration从配置中创建重复的 Spring Boot 控制器
【发布时间】: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


【解决方案1】:

你可以的

@CrossOrigin("*")
@RestController
@RequestMapping("/api/v1/{childtype}")
public class RealtimeController {
    public RealtimeService getService(String childtype){
        return map.get(childtype);
    }

    @PostMapping(value = "/find")
    public ResponseEntity<Iterable<Object>> find(@PathVariable("childtype") String childtype, @RequestBody Object entity) {

        return ResponseEntity.ok(getServiceByType(childtype).findAllByKey(entity));
    }
}

您现在只需要使用服务实例填充地图。

【讨论】:

  • 我想到了这个。在这种情况下,springfox 不会单独注册控制器,只会创建一个端点。加上对象类型在这里是动态的。 ://
猜你喜欢
  • 2017-01-25
  • 2018-02-18
  • 2020-08-12
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2020-05-29
相关资源
最近更新 更多