java Sping Boot 中REST API的多个端点

643ylb08  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(127)

我在一个表中有两个唯一的键:iduserId。我必须在Spring中创建一个REST API,以获取用户详细信息,如果这两个键中的任何一个作为路径变量给出。
这里的挑战是我们必须创建两个不同的端点,通过id获取用户和通过userId获取用户,但两者使用相同的方法。在我的表中,id的数据类型是longuserId的数据类型是String
因此,我尝试做以下工作:

@RequestMapping(value = {"/{id}","/user/{id}"}, method=RequestMethod.GET)
public response getUser(@PathVariable("id") String id) {
    
}

但是我不知道如何检查我在方法中得到的是id还是userId,这是正确的方法吗?

h43kikqp

h43kikqp1#

你可以用这样的方法来实现:

@RequestMapping(value = {"/{id}", "/user/{userId}"}, method = RequestMethod.GET)
public void getUser(@PathVariable(value = "id", required = false) String id,
  @PathVariable(value = "userId", required = false) Long userId) {
    if (id != null) {
    //TODO stuff for id
   }
   if (userId != null) {
    //TODO stuff for userId
   }

}

rbl8hiat

rbl8hiat2#

我将使用@RequestMapping多个路径Map到同一个控制器方法的可能性,在这样的方式。
我怀疑,即使您重构代码以调用单个方法,您仍然必须实现一些逻辑来区分控制器方法中的两个参数。
此外,getUserById()签名是二义性的,参数id意味着id还是userId
有两个单独的方法来实现你想要的会更有效,两个方法可以正确地处理每种情况。如果你愿意,在每个控制器方法中,你可以为这两个方法使用一个公共逻辑。

@RequestMapping(value = "/user/{userId}", method=RequestMethod.GET)
public String getUserById(@PathVariable("userId") String userId){
   // Common login
}

@RequestMapping(value = "/id", method=RequestMethod.GET)
public String getUserByUserId(@PathVariable("userId") String userId){
   // Common login
}

您甚至可以为每个端点实现验证器,以检查您@PathVariable是否有效(如果是LongString
以下是一些参考ref1ref2

c6ubokkw

c6ubokkw3#

难道你不能重构数据库使其只有一个id吗?这会使事情变得清晰,并保持代码的整洁。
如果这是不可能的,你可以创建两个有意义的名字的方法。

// handles: /user/{entityId}
@RequestMapping(value = "/user/{entityId}", method=RequestMethod.GET)
public UserDto getUserByEntityId(@PathVariable("entityId") long entityId){
   // call service 
}

// handles: /user?userId={userId}
@RequestMapping(value = "/user", method=RequestMethod.GET)
public UserDto getUserByUserId(@RequestParam("userId", required=true) String userId){
   // call service 
}

您可以讨论有关方法的正确名称/签名。
这种方法的另一个优点是,您可以为每个文档添加Swagger文档注解。

相关问题