java Sping Boot 控制器返回通用类型(A或B)

eanckbw9  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(104)

我开发了一个简单的带有 Boot 的todo-list应用程序,我想发送所有请求的通用响应数据,因为响应消息中的数据可以是各种类型的。

public class ResponseMessage<T> {
    private int statusCode = HttpStatus.OK.value();
    private String message = "";
    protected T data;  // this is generic. it can be many response dto.

    public static ResponseMessage<String> ok() {
        return new ResponseMessage<>("");
    }

    public static <T> ResponseMessage<T> ok(T data) {
        return new ResponseMessage<>(data);
    }

    public static ResponseMessage<Object> noContent() {
        return new ResponseMessage<>(HttpStatus.NO_CONTENT.value(), HttpStatus.NO_CONTENT.getReasonPhrase(), "");
    }

    protected ResponseMessage(T data) {
        this.data = data;
    }

    private ResponseMessage(int statusCode, String message, T data) {
        this.statusCode = statusCode;
        this.message = message;
        this.data = data;
    }

    protected ResponseMessage() {}

    public int getStatusCode() {
        return statusCode;
    }

    public String getMessage() {
        return message;
    }

    public T getData() {
        return data;
    }
}

现在我需要做一个功能,找到一个recend待办事项。
如果待办事项存在,则发送ResponseMessage。

{
  "statusCode": 200,
  "message": "",
  "data": [
    {
        "id": 1,
        "title": "test",
        "status": "TODO"
    }
  ]
}

如果待办事项不存在,请发送ResponseMessage。

{
  "statusCode": 200,
  "message": "",
  "data": []
}

现在我的控制器函数返回如下。

public ResponseMessage<?> findRecent(@AuthenticationPrincipal LoginUser user) {
    Optional<TodoResponse> todo = todoService.findRecent(user.getId());
    return todo.isPresent() ? ResponseMessage.ok(todo.get()) : ResponseMessage.noContent();
}

我知道问号“?”是不好的。那么什么是更好的方式返回A或B在这种情况下?请帮助我。

fnx2tebb

fnx2tebb1#

如果将noContent().data设置为null,则可以安全地为其指定任何类型:

public static <T> ResponseMessage<T> noContent() {
    return new ResponseMessage<>(HttpStatus.NO_CONTENT.value(), HttpStatus.NO_CONTENT.getReasonPhrase(), null);
}

还要注意,调用Optional.isPresent(),然后调用get()是一种反模式,在您的情况下,可以将其简化为:

return todoService.findRecent(user.getId())
        .map(ResponseMessage::ok)
        .orElseGet(ResponseMessage::noContent);

相关问题