Spring Boot多JSON格式响应实现及校验代码复用方案咨询
嘿,针对你的两个技术问题,结合你贴出来的代码示例,我来给你详细捋捋解决方案:
问题1:如何在Spring Boot应用中发送多个JSON格式的响应?
其实你当前的代码已经在输出不同的JSON响应了——通过EmployeeResponse对象的不同字段值(responseMessage和responseCode),Spring Boot会自动把它序列化为JSON返回给前端。
如果你的需求是返回不同结构的JSON响应(比如成功时返回员工完整数据,失败时只返回错误信息),可以用这两种方式优化:
- 定义泛型统一响应类:比如
ApiResponse<T>,成功时传入员工数据,失败时传入错误详情或null - 用
ResponseEntity包装响应:它能灵活设置HTTP状态码和响应体,示例如下:// 成功响应 return ResponseEntity.ok(new EmployeeResponse("success", "200")); // 参数错误响应 return ResponseEntity.badRequest().body(new EmployeeResponse("Invalid name", "400"));
如果只是需要不同的状态提示,你现在的EmployeeResponse结构完全够用,只要填充不同的字段值就能生成不同的JSON响应啦。
问题2:消除if条件判断里的重复代码
你代码里每个if分支都重复执行setResponseMessage、setResposeCode(注意这里你拼写错了,应该是responseCode)然后return response,确实冗余。这里有两个实用的优化方案,按推荐程度排序:
方案1:使用Spring验证框架(最推荐)
Spring支持JSR-380(Bean Validation)规范,能帮你自动完成参数校验,不用自己写一堆if判断。步骤如下:
给
EmployeeBean添加校验注解:import javax.validation.constraints.Pattern; public class EmployeeBean { @Pattern(regexp = "^\\S{3,}$", message = "Invalid name") private String ename; @Pattern(regexp = "^\\S{4,}$", message = "Invalid job") private String ejob; @Pattern(regexp = "^[0-9]{2}$", message = "Invalid age") private Integer eage; // getter、setter省略 }在Controller中启用校验并统一处理异常:
import javax.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; @RestController public class EmployeeController { @RequestMapping(value = "regmep", method = RequestMethod.POST) public ResponseEntity<EmployeeResponse> registerEmp(@Valid @RequestBody EmployeeBean emp) { EmployeeResponse response = new EmployeeResponse(); response.setResponseMessage("success"); response.setResponseCode("200"); // 修正拼写错误 return ResponseEntity.ok(response); } // 全局捕获参数校验异常 @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public EmployeeResponse handleValidationErrors(MethodArgumentNotValidException ex) { EmployeeResponse response = new EmployeeResponse(); // 获取第一个校验错误的提示信息 String errorMsg = ex.getBindingResult().getFieldErrors().get(0).getDefaultMessage(); response.setResponseMessage(errorMsg); response.setResponseCode("400"); return response; } // 捕获NullPointerException @ExceptionHandler(NullPointerException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public EmployeeResponse handleNullErrors() { EmployeeResponse response = new EmployeeResponse(); response.setResponseMessage("bad request"); response.setResponseCode("400"); return response; } }
这样所有参数校验逻辑都交给框架处理,你的Controller代码会简洁很多!
方案2:提取公共方法(快速优化)
如果暂时不想引入验证框架,可以把重复的错误响应代码提取成一个工具方法:
@RestController public class EmployeeController { @RequestMapping(value = "regmep", method = RequestMethod.POST) public @ResponseBody EmployeeResponse registerEmp(@RequestBody EmployeeBean emp) { try { if (!Pattern.matches("^\\S{3,}$", emp.getEname())) { return buildErrorResponse("Invalid name", "400"); } else if (!Pattern.matches("^\\S{4,}$", emp.getEjob())) { return buildErrorResponse("Invalid job", "400"); } else if (!Pattern.matches("^[0-9]{2}$", emp.getEage().toString())) { return buildErrorResponse("Invalid age", "400"); } else { EmployeeResponse response = new EmployeeResponse(); response.setResponseMessage("success"); response.setResponseCode("200"); // 修正拼写错误 return response; } } catch (NullPointerException e) { return buildErrorResponse("bad request", "400"); } } // 提取公共的错误响应构建方法 private EmployeeResponse buildErrorResponse(String message, String code) { EmployeeResponse response = new EmployeeResponse(); response.setResponseMessage(message); response.setResponseCode(code); // 修正拼写错误 return response; } }
这样每个判断分支只需要调用buildErrorResponse,彻底消除重复代码。另外记得修正你代码里的setResposeCode拼写错误哦!
内容的提问来源于stack exchange,提问作者kaushal kumar
相关产品推荐
相关产品推荐

