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
相关产品推荐
相关产品推荐

