在開發中我們難免遇到1代表X1,2代表X2,3代表X3等這種業務類型的常量,在如今的微服務前後端完全分離的開發中,對接這些業務常量成了很棘手的問題。
eg: 在做第三方項目時有很多第三方公司自定義一些常量,比如道路級別:1-主要道路;2-次要道路;3-背街小巷",因爲這個常量在很多子系統也用到,爲了確保唯一性、數據庫採用枚舉類型、前端也要確保傳入的也必須是1、2、3,可以利用自定義參數校驗器來實現。實現如下:
一、數據庫層面採用枚舉類型
二、創建業務常量類
public interface BusinessTypeConstant {
/**
*道路級別:1-主要道路;2-次要道路;3-背街小巷
*/
String ROAD_LEVEL_MAIN = "1";//主要道路
String ROAD_LEVEL_MINOR = "2";//次要道路
String ROAD_LEVEL_ALLEY = "3";//背街小巷
}
三、 自定義註解
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = BusinessTypeValidator.class)
@Documented
public @interface BusinessType {
String message() default "業務類型有誤";
String[] value() default {};
int[] intValue() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
ReturnCode returnCode() default ReturnCode.BUSINESS_TYPE_ERROR;
}
四、業務類型參數校驗器實現註解參數校驗
public class BusinessTypeValidator implements ConstraintValidator<BusinessType, Object> {
private String[] businessTypeValues;
private int[] intValue;
@Override
public void initialize(BusinessType businessType) {
businessTypeValues = businessType.value();
intValue = businessType.intValue();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext ctx) {
if (value == null) {
return true;
}
if (value instanceof String) {
for (int i = 0; i < businessTypeValues.length; i++) {
if (value.equals(businessTypeValues[i])) {
return true;
}
}
} else if (value instanceof Integer) {
for (int i = 0; i < intValue.length; i++) {
if (value.equals(intValue[i])) {
return true;
}
}
}
return false;
}
}
五、在前端傳來入參時做校驗
@ApiModelProperty(value = "道路級別:1-主要道路;2-次要道路;3-背街小巷", required = true)
@BusinessType({
BusinessTypeConstant.ROAD_LEVEL_MAIN,
BusinessTypeConstant.ROAD_LEVEL_MINOR,
BusinessTypeConstant.ROAD_LEVEL_ALLEY
})
String level;
六、當前端參數傳來通不過時,會返回自定義註解裏面的定義信息,可以繼續封裝返回的信息
總結: 這樣就很方便的達到了目的、從前端傳來的參數必須是制定的類型、存入數據庫的數據或者導入數據庫的數據也必須是這指定的類型、其它系統掉用也就完美解決了業務類型常量在各個子系統之間的統一性。