我发现了个问题,在前后端联调的时候,定义的参数不规范,没有进行校验。导致两方沟通,哪些字段必传,另外会写很多 if(fieldA = null) { 提示} if(fieldB = null) { 提示} 这样的方法
下面我写一个工具类解决这个问题
1.在校验的方法上写上注解
import javax.validation.constraints.NotBlank; import java.util.List; @Data @ApiModel(value = "SysPriceDTO对象", description = "SysPriceDTO对象") public class SysPriceDTO extends SysPrice { @ApiModelProperty(value = "区域ID用逗号隔开(1,2,3)") @NotBlank(message = "地区id不能为空") private String regionIds; }
2.写一个工具类如果为空则提示(用到了反射,拿到dto的方法)
public class ValidateUtil { public static ValidDTO check(Object o) throws Exception{ ValidDTO validDTO = new ValidDTO(); Class<?> c = o.getClass(); for(Field field :c.getDeclaredFields()){ if(field.isAnnotationPresent(NotBlank.class)||field.isAnnotationPresent(NotNull.class)){ field.setAccessible( true ); Method m = (Method) o.getClass().getMethod("get" + getMethodName(field.getName())); String val = (String) m.invoke(o);// 调用getter方法获取属性值 if (StringUtils.isEmpty(val)) { validDTO.setFlag(false); validDTO.setMessage(field.getAnnotation(NotBlank.class).message()); return validDTO; } } } return validDTO; } private static String getMethodName(String fildeName) throws Exception{ byte[] items = fildeName.getBytes(); items[0] = (byte) ((char) items[0] - 'a' + 'A'); return new String(items); } }
@Data public class ValidDTO implements Serializable { private static final long serialVersionUID=1L; public Boolean flag = true; public String message; }
3.传参的时候直接调用这个工具类,可以校验啦!
@Override public ApiResult addPrice(HttpServletRequest request, SysPriceDTO sysPriceDTO) throws Exception{ //校验 ValidDTO validDTO = ValidateUtil.check(sysPriceDTO); if(!validDTO.getFlag()){ return ApiResultUtil.fail(-1, validDTO.getMessage()); } String userId = (String) request.getAttribute(Constant.USER_ID_IN_REQUEST); }