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

Spring RestController如何返回多个对象?附代码示例

如何在Spring RestController中同时返回多个对象

你当前代码里的 ResponseEntity.of(Optional.of(save,mappingJacksonValue)) 存在语法错误,Optional.of() 仅支持传入单个参数,无法直接返回多个对象。要实现同时返回多个对象,有以下两种常用方案:

方案一:自定义DTO类(推荐)

创建专门的响应DTO类封装需要返回的多个对象,这种方式类型安全,便于后续维护和扩展。

1. 定义响应DTO

public class ContractResponse {
    private Contract originalContract;
    private Contract filteredContract;

    // 构造方法
    public ContractResponse(Contract originalContract, Contract filteredContract) {
        this.originalContract = originalContract;
        this.filteredContract = filteredContract;
    }

    // Getter和Setter方法(或使用Lombok的@Data注解简化代码)
    public Contract getOriginalContract() {
        return originalContract;
    }

    public void setOriginalContract(Contract originalContract) {
        this.originalContract = originalContract;
    }

    public Contract getFilteredContract() {
        return filteredContract;
    }

    public void setFilteredContract(Contract filteredContract) {
        this.filteredContract = filteredContract;
    }
}

2. 修改Controller方法

用MappingJacksonValue包装DTO,同时对指定字段应用过滤规则:

@PostMapping("/buyContractRequest")
public ResponseEntity<MappingJacksonValue> saveOneContract(@RequestBody Contract contract) {
    try {
        contract.setOrderId(UUID.randomUUID().toString());
        Date date = new Date();
        contract.setTimestamp(date);
        Contract save = contractService.saveOne(contract);

        // 封装DTO
        ContractResponse response = new ContractResponse(save, save);

        // 应用字段过滤规则
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(response);
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept(
            "buyerId","timestamp","category","orderId"
        );
        FilterProvider filters = new SimpleFilterProvider().addFilter("ContractFilter", filter);
        mappingJacksonValue.setFilters(filters);

        return ResponseEntity.ok(mappingJacksonValue);
    } catch (Exception e) {
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

方案二:使用Map快速实现

如果不想额外创建DTO类,可以用Map临时封装多个对象,适合快速开发场景:

@PostMapping("/buyContractRequest")
public ResponseEntity<MappingJacksonValue> saveOneContract(@RequestBody Contract contract) {
    try {
        contract.setOrderId(UUID.randomUUID().toString());
        Date date = new Date();
        contract.setTimestamp(date);
        Contract save = contractService.saveOne(contract);

        // 用Map封装两个对象
        Map<String, Object> responseMap = new HashMap<>();
        responseMap.put("originalContract", save);
        responseMap.put("filteredContract", save);

        // 应用字段过滤规则
        MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(responseMap);
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept(
            "buyerId","timestamp","category","orderId"
        );
        FilterProvider filters = new SimpleFilterProvider().addFilter("ContractFilter", filter);
        mappingJacksonValue.setFilters(filters);

        return ResponseEntity.ok(mappingJacksonValue);
    } catch (Exception e) {
        e.printStackTrace();
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

注意事项

  • 确保你的Contract类上添加了@JsonFilter("ContractFilter")注解,否则字段过滤规则不会生效。
  • 如果不需要对返回对象做字段过滤,可以直接返回ResponseEntity<ContractResponse>或ResponseEntity<Map>,无需使用MappingJacksonValue。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:32:42