Spring MVC如何在请求体的实体对象外传递额外自定义字段
解决方案
下面是两种完全不需要修改原有Course实体类的实现方式:
方案1:新增接口请求DTO(最推荐)
这是符合开发分层规范的常规做法,核心Course实体类对应业务/持久层模型,接口入参单独用DTO(数据传输对象)承接,避免非业务字段污染核心实体。
- 新建
CoursePostRequest.java类,继承原有Course类,补充额外字段:
// 用Lombok的话直接加@Data注解,省去手写getter、setter public class CoursePostRequest extends Course { private Integer page_size; private String sort_order; // 手动补充两个字段的getter、setter方法 public Integer getPage_size() { return page_size; } public void setPage_size(Integer page_size) { this.page_size = page_size; } public String getSort_order() { return sort_order; } public void setSort_order(String sort_order) { this.sort_order = sort_order; } }
- 修改接口入参类型为新建的DTO即可:
public Course postcourse (@RequestBody CoursePostRequest request) { // 原有Course相关逻辑直接用request即可(它本身是Course的子类) // 需要取额外参数直接调用对应getter方法就行 }
该方案后续加参数校验、新增入参都很方便,维护性最高。
方案2:用Map承接请求体再手动解析
如果不想额外新增类,可以先用Map接收完整请求体,再单独解析出Course对象和额外参数:
public Course postcourse (@RequestBody Map<String, Object> requestMap) { // 转换核心Course字段 ObjectMapper objectMapper = new ObjectMapper(); Course course = objectMapper.convertValue(requestMap, Course.class); // 单独获取额外参数 Integer pageSize = (Integer) requestMap.get("page_size"); String sortOrder = (String) requestMap.get("sort_order"); // 后续业务逻辑 }
该方案不用新增类,但没有编译期参数校验,适合参数临时新增、后续不会频繁变动的场景。
内容的提问来源于stack exchange,提问作者rudeTool
相关产品推荐
相关产品推荐

