如何 return 响应实体可以是两种不同类型的 Mono<ResponseEntity>
How to return a Mono<ResponseEntity> where the response entity can be of two different types
我是 Spring Webflux / Reactor Core 的新手,我正在尝试执行以下功能:
调用userservice.LoginWebApp()
如果用户 returned,return 类型为 "User" 的 ResponseEntity。如果为空,Return 类型为 "String"
的 ResponseEntity
以下代码给出类型错误,因为 .defaultIfEmpty() 需要用户类型的 ResponseEntity。您能否就实现此功能的正确运算符/方法提出建议。
@PostMapping("api/user/login/webApp")
public Mono<ResponseEntity> login(@RequestBody Credentials credentials, ServerWebExchange serverWebExchange) {
return userService.loginWebApp(credentials, serverWebExchange)
.map(user -> ResponseEntity.status(HttpStatus.OK).body(user))
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password"));
}
我会做以下事情:
为响应建立基础class
abstract class Response {
}
为每种响应(如 UserResponse、ErrorResponse、NotFoundResponse 等)创建单独的 classes,并从基础 Response
class
class UserResponse extends Response {
private String login;
private String password;
public UserResponse(String login, String password) {
this.login = login;
this.password = password;
}
@JsonGetter("login")
public String getLogin() {
return login;
}
@JsonSetter("login")
public void setLogin(String login) {
this.login = login;
}
@JsonGetter("password")
public String getPassword() {
return password;
}
@JsonSetter("password")
public void setPassword(String password) {
this.password = password;
}
}
class ErrorResponse extends Response {
private String errorMessage;
public ErrorResponse(String errorMessage) {
this.errorMessage = errorMessage;
}
@JsonGetter("error_message")
public String getErrorMessage() {
return errorMessage;
}
@JsonSetter("error_message")
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
明确设置return值的类型Mono<ResponseEntity<Response>>
就是这样。
@GetMapping("/test/{login}")
public Mono<ResponseEntity<Response>> test(@PathVariable(value = "login") String login) {
return loginWebApp(login)
.map(userResponse -> ResponseEntity.status(HttpStatus.OK).body(userResponse))
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse("bad login")));
}
现在让我们尝试登录错误:
成功登录:
可以找到完整代码here
您可以使用 cast
运算符从泛型中向下转换,我相信 WebFlux 仍然能够编组 User
和 String
:
@PostMapping("api/user/login/webApp")
public Mono<ResponseEntity> login(@RequestBody Credentials credentials, ServerWebExchange serverWebExchange) {
return userService.loginWebApp(credentials, serverWebExchange)
.map(user -> ResponseEntity.status(HttpStatus.OK).body(user))
.cast(ResponseEntity.class)
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password"));
}
我是 Spring Webflux / Reactor Core 的新手,我正在尝试执行以下功能:
调用userservice.LoginWebApp()
如果用户 returned,return 类型为 "User" 的 ResponseEntity。如果为空,Return 类型为 "String"
的 ResponseEntity
以下代码给出类型错误,因为 .defaultIfEmpty() 需要用户类型的 ResponseEntity。您能否就实现此功能的正确运算符/方法提出建议。
@PostMapping("api/user/login/webApp")
public Mono<ResponseEntity> login(@RequestBody Credentials credentials, ServerWebExchange serverWebExchange) {
return userService.loginWebApp(credentials, serverWebExchange)
.map(user -> ResponseEntity.status(HttpStatus.OK).body(user))
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password"));
}
我会做以下事情:
为响应建立基础class
abstract class Response { }
为每种响应(如 UserResponse、ErrorResponse、NotFoundResponse 等)创建单独的 classes,并从基础
Response
classclass UserResponse extends Response { private String login; private String password; public UserResponse(String login, String password) { this.login = login; this.password = password; } @JsonGetter("login") public String getLogin() { return login; } @JsonSetter("login") public void setLogin(String login) { this.login = login; } @JsonGetter("password") public String getPassword() { return password; } @JsonSetter("password") public void setPassword(String password) { this.password = password; } } class ErrorResponse extends Response { private String errorMessage; public ErrorResponse(String errorMessage) { this.errorMessage = errorMessage; } @JsonGetter("error_message") public String getErrorMessage() { return errorMessage; } @JsonSetter("error_message") public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } }
明确设置return值的类型
Mono<ResponseEntity<Response>>
就是这样。@GetMapping("/test/{login}") public Mono<ResponseEntity<Response>> test(@PathVariable(value = "login") String login) { return loginWebApp(login) .map(userResponse -> ResponseEntity.status(HttpStatus.OK).body(userResponse)) .defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse("bad login"))); }
现在让我们尝试登录错误:
成功登录:
可以找到完整代码here
您可以使用 cast
运算符从泛型中向下转换,我相信 WebFlux 仍然能够编组 User
和 String
:
@PostMapping("api/user/login/webApp")
public Mono<ResponseEntity> login(@RequestBody Credentials credentials, ServerWebExchange serverWebExchange) {
return userService.loginWebApp(credentials, serverWebExchange)
.map(user -> ResponseEntity.status(HttpStatus.OK).body(user))
.cast(ResponseEntity.class)
.defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password"));
}