我们定义一个实体类
import javax.validation.constraints.Min; import javax.validation.constraints.Pattern; public class ORDER_INFO { @Pattern(regexp="^[A-Za-z0-9_-]{1,20}$",message="订单号格式不正确") private String out_trade_no; @Min(value=0,message="订单金额不能是负数") private long total_fee; }
在上面的实体里当中 我们定义了两个参数:订单号out_trade_no
o和 金额total_fee
在订单号里我们使用了正则表达式标记订单必须为1-20位的字母、数字、中划线或下划线。否则提示“订单号格式不正确”。
下面我们来编写Controller来接受参数并验证
@PostMapping("/create") public MessagePack createPay(@Validated ORDER_INFO order_info,BindingResult bindingResult ){ if(bindingResult.hasErrors()){ throw new RuntimeException(bindingResult.getFieldError().getDefaultMessage()); } MessagePack pack = new MessagePack(); pack.setCode(0); pack.setMessage("ok"); return pack; }
这个方法里,我们接受POST请求,并且将参数和ORDER_INFO校验
第二个参数bindingResult
里会给包含校验结果,我们进行判断,并获取第一条错误消息装入异常里抛出。
那这时如果直接抛出异常,前端页面会出现500错误页面。这不是我们想要的,我们想要的是
{"code":-1,"message":"订单号格式不正确","object":null,"status":"PLAT_ERROR"}
所以我们需要对异常进行捕获处理。
这里我们就需要写一个全局异常捕获处理类。
@RestControllerAdvice public class ExceptionHandler { public static final String PLAT_ERROR = "PLAT_ERROR"; @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class) public MessagePack handler(Exception ex){ MessagePack pack = new MessagePack(); pack.setCode(MessagePack.ERROR); pack.setMessage(ex.getMessage()); pack.setStatus(PLAT_ERROR); return pack; } }
这里的操作就是捕获所有Exception异常,并且定义一个MessagePack
类进行输出。
这个类很简单。内容如:
public class MessagePack implements java.io.Serializable { public static final long OK = 0; public static final long ERROR = -1; private long code; // 信息 private String message; // 携带的值 private Object object; private String status; }
好了大功告成。我们开始测试。
测试地址:
http://localhost:8080/scanBarcodePay/create?out_trade_no=&total_fee=1
我们直接给一个空的字符串给out_trade_no。很明显,这个并不满足之前的正则表达式。所以后端返回的就是: