JAVA关于列表查询参数校验的问题

Posted ctc_shark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA关于列表查询参数校验的问题相关的知识,希望对你有一定的参考价值。

平时我们在web项目中,经常会通过Map进行接收参数进行查询,其中经常有这样的需求,需要对某个参数要验证必须有值,要验证某些参数的传参格式是否符合需要的类型。

经常我们是这样的实现:

@PostMapping(value = "/user/list") 
public String list(Map<String, Object> params) {
Object userName = params.get("userName");

if(userName == null || String.valueOf(userName).equal("")) {
return "参数userName不能空"!
}

}


@PostMapping(value = "/role/list") 
public String list(Map<String, Object> params) {
Object roleName = params.get("role");

if(roleName == null || String.valueOf(roleName).equal("")) {
return "角色名称不能为空"!
}

}


类似这样的一些列表进行查询的时候都需要参数进行校验,当我们有多这样的查询的时候都需要写相关的校验,这时就会显得很冗余,如何解决该类型的写法呢?


下面介绍项目中常用的一种实现,基于validation-api的验证。


JAVA关于列表查询参数校验的问题_JAVA


定义检查类:

@Constraint(validatedBy = RequiredFieldCheckImpl.class)
@Target(value = {ElementType.PARAMETER})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface RequiredFieldCheck {

/**
* 拦截的字符串
*
* @return
*/
String[] requiredField() default {};

/**
* 值类型.
*
* @return
*/
String[] requiredFieldValueType() default {};

/**
* 验证不通过时的错误提示信息
* @return
*/
String message() default "参数值不能为空!";

/**
* 分组
* @return
*/
Class<?>[] groups() default {};

/**
* 负载
* @return
*/
Class<? extends Payload>[] payload() default {};

/**
* 分页页数
* @return
*/
int pageNum() default 1;

/**
* 分页条数
* @return
*/
int pageSize() default 10;


}


检查类的具体实现:

public class RequiredFieldCheckImpl implements ConstraintValidator<RequiredFieldCheck, Map<String, Object>> {

private String[] required;
private int pageSize;
private int pageNum;
//private String[] requiredType;
private Map<String, String> fieldTypeMap;

/**
* 初始化
*
* @param constraintAnnotation
*/
@Override
public void initialize(RequiredFieldCheck constraintAnnotation) {
this.required = constraintAnnotation.requiredField();
this.pageNum = constraintAnnotation.pageNum();
this.pageSize = constraintAnnotation.pageSize();
String[] checkFieldType = constraintAnnotation.requiredFieldValueType();
fieldTypeMap = new HashMap<>();

for (String type : checkFieldType) {
String[] tmps = type.split(":");
fieldTypeMap.put(tmps[0], tmps[1]);
}

TopsecLogUtil.info("check field :" + ArrayUtil.join(required, ","));
}

/**
* 检验逻辑
*
* @param value
* @param context
* @return
*/
@Override
public boolean isValid(Map<String, Object> value, ConstraintValidatorContext context) {

if (ArrayUtil.isEmpty(required)) {
return true;
}
if (CollUtil.isEmpty(value)) {
bulidValidResult(context, ArrayUtil.join(required, ","));
return false;
}
for (String each : required) {
if (!value.containsKey(each) || StrUtil.isEmpty(value.get(each).toString())) {
bulidValidResult(context, each);
return false;
}

/* if (fieldTypeMap.containsKey(each)) {
if(!bulidParams(fieldTypeMap.get(each), value, each)) {
bulidValidTypeResult(context, each);
return false;
}
}*/
}

for(String key : fieldTypeMap.keySet()) {
if(value.containsKey(key) && value.get(key) != null) {
if(!bulidParams(fieldTypeMap.get(key), value, key)) {
bulidValidTypeResult(context, key);
return false;
}
}else {
initParams(fieldTypeMap.get(如何在片段中使用 GetJsonFromUrlTask​​.java

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

关于参数校验,hibernate的validator 的校验

Java初识方法

Java参数校验工具validation实践

Struts2请求参数校验