在 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
虽然有无数种方法可以做到这一点...您可以使用 enums
、integers
、strings
等...
从可维护性的角度来看,我认为这是最干净的解决方案,您可以让服务公开两个这样的方法...
然后在你的控制器中使用适当的方法
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
。如果它不是那么相关并且确实是特定于端点的,为什么将此逻辑推到服务层?
我目前对 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
虽然有无数种方法可以做到这一点...您可以使用 enums
、integers
、strings
等...
从可维护性的角度来看,我认为这是最干净的解决方案,您可以让服务公开两个这样的方法...
然后在你的控制器中使用适当的方法
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
。如果它不是那么相关并且确实是特定于端点的,为什么将此逻辑推到服务层?