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

错误Spring React REST控制器使用自定义类响应(WebFlux)

林烨华
2023-03-14

我正在尝试构建一个Spring WebFlux项目,并实现以下业务逻辑:

1-使用WebClient调用外部REST Api,并使用下面的模型解析Json结果。它工作正常

谢谢

# Json Result
{
    "data": [
        {
            "id": "5bc3c0efe833d93f401bafa8",
            "name": "XXXXX",
            "group": "5b8fd1fa0499f54cfa7febb8",
            "description": "Geolocalizacao gps",
            "payloadType": "None",
            "contract": "5bc08be5e833d93f40e1f936",
            "keepAlive": 0
        }
    ]
}

# Controller
public class DeviceController{
    ...
    ...

    @RequestMapping(value = V1 + BASE_URL + "/devices/types", method = GET, produces = APPLICATION_JSON)
    public Mono<ServerResponse> getDeviceTypes(){
        Mono<DeviceList> devices = deviceService.findDeviceTypes();

        ResponseApi r = new ResponseApi();
        r.setMessage("Test");
        r.setCode("200");
        r.setStatus(200);
        r.setData(devices);

        return ok().body(Mono.just(r), ResponseApi.class);
    }
}   

# Repository
public Mono<DeviceList> findDeviceTypes() {
    return webClient.get()
            .uri(DEVICE_TYPES_URL)
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToMono(DeviceList.class);
}

# Model
public class DeviceList{

    @JsonProperty("data")
    private List<Device> data;

    public List<Device> getData() {
        return data;
    }

    public void setData(List<Device> data) {
        this.data = data;
    }
}

public class Device{

    @JsonProperty("id")
    private String id;

    @JsonProperty("name")
    private String name;

    @JsonProperty("group")
    private String group;

    @JsonProperty("description")
    private String description;

    @JsonProperty("keepAlive")
    private Integer keepAlive;

    @JsonProperty("payloadType")
    private String payloadType;

    @JsonProperty("contract")
    private String contract;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getKeepAlive() {
        return keepAlive;
    }

    public void setKeepAlive(Integer keepAlive) {
        this.keepAlive = keepAlive;
    }

    public String getPayloadType() {
        return payloadType;
    }

    public void setPayloadType(String payloadType) {
        this.payloadType = payloadType;
    }

    public String getContract() {
        return contract;
    }

    public void setContract(String contract) {
        this.contract = contract;
    }
}

@JsonRootName("data")
public class ResponseApi{

    @JsonProperty("status")
    private Integer status;

    @JsonProperty("code")
    private String code;

    @JsonProperty("message")
    private String message;

    @JsonProperty("data")
    private Object data;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

共有1个答案

乐正乐湛
2023-03-14

您可以获取设备,然后以非阻塞的方式将它们映射到ResponseApi,如下所示:

@RequestMapping(value = V1 + BASE_URL + "/devices/types", method = GET, produces = APPLICATION_JSON)
public Mono<ServerResponse> getDeviceTypes(){
    return deviceService.findDeviceTypes()
            .flatMap(devices -> {
                ResponseApi r = new ResponseApi();
                r.setMessage("Test");
                r.setCode("200");
                r.setStatus(200);
                r.setData(devices);
                return ok().body(Mono.just(r), ResponseApi.class);
            });
}
 类似资料:
  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • 我想自定义Laravel邮件错误页 现在我有这个页面错误 (1/1)Swift_TransportException预期响应代码250,但得到代码“535”,消息“535-5.7.8用户名和密码不被接受。在535 5.7.8了解更多信息https://support.google.com/mail/?p=BadCredentialsu13sm7041792wre.52-gsmtp” 但我想告诉我这

  • 将响应实体主体类型更改为String非常有效。怎么了?也许这是窃听器? 附注:使用Spring4.2.8,Spring靴1.3.8。

  • 请帮助我了解我应该在哪里更新失败案例的实际合同?