在 spring 启动时检测哪个端点进入了我们的微服务

detect which endpoint entered our microservice in spring boot

我目前对 Spring Boot

中的开发有些困惑

基本上,我有 2 个不同 URL 的控制器,但它们会进入相同的服务。服务内部。

根据 URL 结果几乎相同,只是改变了 1 个属性的值,所以它通过相同的服务,其中有一个小的条件来填充一个值或另一个值。

我修改了传递布尔值的服务,但他们不接受它,我想知道是否有某种方法可以知道它何时在我输入的服务端点中?

@PutMapping("/orders/{id}")
ResponseEntity<?> complete(@PathVariable int id ) {

  return OrderService.updateOrder();
}

    
@PutMapping("/orders/{id}/complete")
ResponseEntity<?> complete(@PathVariable int id) {

  return OrderService.updateOrder();
}

据我了解,您想向您的服务发出信号,从哪个端点调用特定函数。

如果您只有两个端点,则添加一个标志 (boolean)。

例如:

@PutMapping("/orders/{id}")
ResponseEntity<?> complete(@PathVariable int id ) {

  return OrderService.updateOrder(true);
}

    
@PutMapping("/orders/{id}/complete")
ResponseEntity<?> complete(@PathVariable int id) {

  return OrderService.updateOrder(false);
}

然后在你的 .updateOrder() 函数中处理你的标志。

或者,如果您有两个以上的端点,请传递 Controller 的 class。

例如

@PutMapping("/orders/{id}")
ResponseEntity<?> complete(@PathVariable int id ) {

  return OrderService.updateOrder(this.getClass());
}

    
@PutMapping("/orders/{id}/complete")
ResponseEntity<?> complete(@PathVariable int id) {

  return OrderService.updateOrder(this.getClass());
}

然后在你的updateOrder(Class clazz)函数中,这样处理:

if(clazz == FirstController.class)
{
    ...
}
else
if(clazz == SecondController.class)
{
    ...
}

// and so on

虽然有无数种方法可以做到这一点...您可以使用 enumsintegersstrings 等...

从可维护性的角度来看,我认为这是最干净的解决方案,您可以让服务公开两个这样的方法...

然后在你的控制器中使用适当的方法

class OrderService {
   updateOrderOneWay() {updateOrder(); ... some custom logic}
   updateOrderAnotherWay() {updateOrder(); ... some custom logic}
   private updateOrder()
}

据我了解,您想使用一个端点进行服务,您可以使用这个 @PutMapping("/订单/{id}") ResponseEntity 完成(@PathVariable int id){

returnOrderService.updateOrder(); }

@PutMapping("/orders/{id}/complete") ResponseEntity 已完成(@PathVariable int id){

returnOrderService.updateOrder(); }

如果你想知道哪个调用你必须改变变量 @PutMapping("/订单/{id}") ResponseEntity 完成(@PathVariable int id){

returnOrderService.updateOrder(); }

@PutMapping("/orders/{id}/complete") ResponseEntity 完成(@PathVariable 长 id){

returnOrderService.updateOrder(); }

你不能用相同的方法使用相同的输入

如果条件具有一些足够相关以具有相应枚举的可行业务逻辑,请考虑创建一个:

enum BusinessLogic {
  PROCESSING_LOGIC_1,  // whatever names apply best to your use case
  PROCESSING_LOGIC_2
}

然后你会用相应的枚举调用updateOrder()

@PutMapping("/orders/{id}")
ResponseEntity<?> complete(@PathVariable int id ) {
  return OrderService.updateOrder(BusinessLogic.PROCESSING_LOGIC_1);
}
    
@PutMapping("/orders/{id}/complete")
ResponseEntity<?> complete(@PathVariable int id) {
  return OrderService.updateOrder(BusinessLogic.PROCESSING_LOGIC_2);
}

然后在你的OrderService你会根据枚举值应用相应的逻辑。

如果因为概念与任何足够相关的业务逻辑不匹配而没有意义,那么我会将此逻辑放入 Controller 而不是 OrderService。如果它不是那么相关并且确实是特定于端点的,为什么将此逻辑推到服务层?