当前位置: 首页 > 知识库问答 >
问题:

如何返回一个Mono,其中响应实体可以是两种不同的类型

常鸿朗
2023-03-14

我是新来的Spring Web通量/Reactor核心,并试图执行以下功能:

>

如果返回用户,则返回“用户”类型的响应实体。如果为空,则返回“字符串”类型的响应实体

以下代码给出了一个类型错误,因为. defaultIf空()期望类型为user的响应实体。您能建议正确的运算符/方法来实现此功能吗?

@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"));
}

共有2个答案

沈弘盛
2023-03-14

我将执行以下操作:

>

abstract class Response {
}

为每种响应(如UserResponse、ErrorResponse、NotFoundResponse等)创建单独的类,并从基本的响应类扩展它们

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;
    }
}

显式设置返回值的类型Mono

@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")));
}

现在让我们尝试一下错误的登录:

良好的登录:

完整代码可在此处找到

秋建义
2023-03-14

您可以使用强制转换操作符来向下转换泛型,我相信WebFlux仍然能够封送用户和字符串:

@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"));
}
 类似资料:
  • 当我从RestController返回POJO时,它在JSON对象中转换。但是当我尝试返回controller返回纯文本。怎么了? 我的RestController:

  • 我想回复ResponseEntity的回复。我对在ResponseEntity中提到返回类型的最佳实践有点困惑。 这是我的控制器: 我的主要责任: 这里我的返回类型是GenericResponse、AdminAccount。在ResponseEntity中提及所有退货类型是否是一种良好的做法? 哪个是最好的方法

  • 问题内容: 我正在尝试学习nodejs,我认为做到这一点的最佳方法是尝试做一些事情而不使用express或任何其他非核心模块。我一直试图让一些文本和图像同时传递。我正在尝试的代码是: 因此,理想的情况是: 但是,什么也没出现。 我写完“ hi there”之后尝试放置一个response.end(),以显示文本,之后我尝试交换文本和图片(包括标题)的位置,以显示图片,但是我不知道了解如何使两者同时

  • 使用Guzzle,我正在使用JSON格式的一些外部API,通常我获取数据 $data = $request- 但是我无法从这个不同的api中获取数据。数据似乎没有出现在“响应体”中。 这个api调用有效:https://i.ibb.co/80Yk6dx/Screenshot-2.png 这不起作用:https://i.ibb.co/C239ghy/Screenshot-3.png

  • 我看到了几个类似的问题,但没有一个对我有效的答案。我正致力于将一个现有的项目转换为使用Hibernate。我正在使用Mysql作为数据库。我有一节课是这样的: 像这样的类: 当我从数据库中获取项时,我将其转换为JSON,最后得到如下格式的结果: 我找到了这个消除错误的答案,但是JSON对象与我添加之前完全相同。在某种程度上,转换到JSON会添加忽略的值。 我使用转换到JSON的方法如下:

  • 我使用的是Spring版本4(Spring data),我想将Object作为JSON返回,我想知道以下代码即使不使用xmlRootElement注释用户类也能工作: 任何机构都可以解释吗?当我需要注释要返回为JSON的对象类时,响应体/响应实体是否自己完成工作?