【发布时间】:2021-03-02 22:05:53
【问题描述】:
我有一个实体Users,其中包含id 和emailAddress。我想编写一个同时拥有 3 个 get 方法的控制器:
- getAll() -
http://localhost:8080/api/users?pageNumber=0&pageSize=10 - get(UUID id) -
http://localhost:8080/api/users/209347293875928375928 - get(String email) -
http://localhost:8080/api/users/fireball%40email.com或http://localhost:8080/api/users?emailAddress="fireball%40email.com"
注意:两段代码的区别在于两者中最后一个函数的参数(第一个是@PathVariable,第二个是@RequestParam。
我尝试了两种方法来实现这一点(都遇到了单独的问题),第一种是:
@GetMapping
@ApiOperation(value = "List all Users")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class, responseContainer = "List"),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
@Transactional(readOnly = true)
public ResponseEntity<Page<User>> getAll(
@RequestParam(required = false, defaultValue = "0") int pageNumber,
@RequestParam(required = false, defaultValue = "10") int pageSize) {
return ResponseEntity.ok(UserService.getUsers(pageNumber, pageSize));
}
@GetMapping(path = "/{id}")
@ApiOperation(value = "Get User by ID")
@Transactional(readOnly = true)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
public ResponseEntity<?> get(@PathVariable("id") final UUID id) {
return UserService.get(id)
.map(ResponseEntity::ok)
.map(ResponseEntity.class::cast)
.orElse(
ResponseEntity.status(NOT_FOUND).body(new Error(format(USER_NOT_FOUND_MESSAGE, id))));
}
@GetMapping
@ApiOperation(value = "Get User by Email Address")
@Transactional(readOnly = true)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
public ResponseEntity<?> get(@RequestParam("email") final String email) {
return UserService.get(email)
.map(ResponseEntity::ok)
.map(ResponseEntity.class::cast)
.orElse(
ResponseEntity.status(NOT_FOUND).body(new Error(format(USER_NOT_FOUND_MESSAGE, email))));
}
上面的代码在编译时失败,Ambiguous mapping. Cannot map 'userController' method 错误。本质上,getAll() 和 get(@RequestParam("email") final String email) 具有相同的 URL 路径 - /users。
第二个:
@GetMapping
@ApiOperation(value = "List all Users")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class, responseContainer = "List"),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
@Transactional(readOnly = true)
public ResponseEntity<Page<User>> getAll(
@RequestParam(required = false, defaultValue = "0") int pageNumber,
@RequestParam(required = false, defaultValue = "10") int pageSize) {
return ResponseEntity.ok(UserService.getUsers(pageNumber, pageSize));
}
@GetMapping(path = "/{id}")
@ApiOperation(value = "Get User by ID")
@Transactional(readOnly = true)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
public ResponseEntity<?> get(@PathVariable("id") final UUID id) {
return UserService.get(id)
.map(ResponseEntity::ok)
.map(ResponseEntity.class::cast)
.orElse(
ResponseEntity.status(NOT_FOUND).body(new Error(format(USER_NOT_FOUND_MESSAGE, id))));
}
@GetMapping(path = "/{email}")
@ApiOperation(value = "Get User by Email Address")
@Transactional(readOnly = true)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = User.class),
@ApiResponse(code = 401, message = "Unauthorized", response = Error.class),
@ApiResponse(code = 404, message = "Not Found", response = Error.class),
@ApiResponse(code = 500, message = "Internal Server Error", response = Error.class)
})
public ResponseEntity<?> get(@PathVariable("email") final String email) {
return UserService.get(email)
.map(ResponseEntity::ok)
.map(ResponseEntity.class::cast)
.orElse(
ResponseEntity.status(NOT_FOUND).body(new Error(format(USER_NOT_FOUND_MESSAGE, email))));
}
在这里我遇到了控制器无法在get(@PathVariable("email") final String email 和get(@PathVariable("id") final UUID id) 之间解析的问题,并出现以下错误:
Ambiguous handler methods mapped for '/api/gems/users/fireball%40email.com': {public org.springframework.http.ResponseEntity com.personal.project.controllers.UserController.get(java.util.UUID), public org.springframework.http.ResponseEntity com.personal.project.controllers.UserController.get(java.lang.String)}
【问题讨论】:
标签: java spring spring-boot api rest