You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Spring Controller按需返回Resource或JSON(解决类型转换错误)

问题解决思路

错误原因

当前方法返回类型固定为ResponseEntity<org.springframework.core.io.Resource>,但需求是根据responseType返回图片(Resource)或JSON对象,当返回JSON时,Object类型无法转换为Resource,导致类型不兼容错误。

解决方案

1. 修改方法返回类型

将方法返回类型改为ResponseEntity<Object>,兼容两种返回类型:

@RequestMapping(
    method = RequestMethod.POST,
    value = "/api/",
    produces = { "image/png", "application/json", "application/xml" },
    consumes = { "application/json", "application/xml" }
)
default ResponseEntity<Object> createEmployeeQR(
    @NotNull @RequestHeader(value = "employeeID", required = true) String employeeID,
    @Valid @RequestBody(required = false) QR qr,
    @RequestParam(value = "responseType", required = true) String responseType // 若responseType在请求体中,直接从qr对象获取即可
) {
    // 根据responseType分支处理
    if ("image".equals(responseType)) {
        // 生成图片Resource的逻辑
        Resource imageResource = generateQRImage(employeeID, qr);
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_PNG)
                .body(imageResource);
    } else if ("json".equals(responseType)) {
        // 生成JSON返回对象的逻辑
        QRResult result = new QRResult(employeeID, "QR generated successfully");
        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(result);
    } else {
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }
}

2. 关键注意事项

  • 若responseType是请求体QR对象的字段,直接通过qr.getResponseType()获取,无需额外添加@RequestParam。
  • 分支处理时必须明确设置contentType,与produces声明的类型对应,避免客户端解析异常。
  • 如需支持XML格式,同理添加对应分支,返回XML结构对象并设置MediaType.APPLICATION_XML。

内容的提问来源于stack exchange,提问作者darthwader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:15:21