日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

sql2008安装时提示参数不能为空_Java Validation API,实现参数的合法性校验

發布時間:2024/8/1 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql2008安装时提示参数不能为空_Java Validation API,实现参数的合法性校验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hibernate Validator是Java Validation API(JSR 303)標準的一個具體實現,用于對參數進行合法性校驗。校驗數據在任何應用中都是一個很常見的任務,所以JCP組織定義了一個標準來規范化這個任務操作,那就是Java Validation API。

先來探討下如何在SpringMVC中集成Java Validation API實現Controller方法入參校驗??梢哉f,所有的Java Web應用都會涉及到對Controller方法入參做校驗,在不使用Java Validation API之前,做校驗時有人是這樣寫的:

@Controller @RequestMapping("/order") public class OrderController {@ResponseBody@RequestMapping(value = "/getOrderDetails", method = RequestMethod.POST)public OrderDetailsVo getOrderDetails(@RequestBody JSONObject json) {String token = json.optString("token");Assert.hasLength(token,1101,"非法請求參數"); String orderCode = json.optString("orderCode");Assert.hasLength(orderCode,1101,"非法請求參數");// .......} }

這種寫法我認為有三個弊端:

  • 用JSONObject來接收入參,取值非常麻煩,很容易就弄錯字段名
  • 如果入參非常復雜,用JSONObject的話,下一個接手的人就很難搞錯清整個方法入參的JSON結構,可維護性極差
  • 方法里校驗邏輯啰嗦重復
  • 下面來看看如何重構這個代碼:

    首先引入validator依賴,如果是springboot項目,那么引入此依賴:

    <dependency><groupId>org.springframework.boot</group><artifactId>spring-boot-starter-validation</artifactId> </dependency>

    一般spring項目可引入此三個依賴:

    <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version> </dependency> <dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.0</version> </dependency> <dependency><groupId>org.glassfish</groupId><artifactId>javax.el</artifactId><version>3.0.0</version> </dependency>

    好的寫法應該是這樣:

    @RestController @RequestMapping("/order") public class OrderController {@RequestMapping(value = "/getOrderDetails", method = RequestMethod.POST)public OrderDetailsResVo getOrderDetails(@Validated @RequestBody OrderDetailsReqVo reqVo) {// .......} }

    其中OrderDetailsReqVo類定義:

    public class OrderDetailsReqVo {@NotBlank // 此注解表明字段不能為null,也不能為空字符串private String token;@NotBlank // 此注解表明字段不能為null,也不能為空字符串private String orderCode;// get set...... }

    添加@Validated就是提示Spring在將JSON入參轉換為OrderDetailsReqVo對象后,對此對象進行校驗。如果校驗不通過Spring則會拋出MethodArgumentNotValidException異常。

    在這里統一捕捉校驗失敗的MethodArgumentNotValidException異常:

    // 不熟悉這些Spring注解的推薦去看《Spring實戰》書籍 @ControllerAdvice public class GlobalHandler {private final Logger logger = LoggerFactory.getLogger(GlobalHandler.class);/*** 所有的校驗失敗情況都會由這里處理*/@ResponseBody@ExceptionHandler(MethodArgumentNotValidException.class)public Result exceptionHandler(MethodArgumentNotValidException e) {Result result = new Result("1101","非法請求參數");logger.error("req params error", e);return result;}// ...... }

    好,開始Java Validation API的學習,先看下都有哪些注解可用:

    JSR 303提供的標準注解:

    Hibernate 提供的額外注解:

    我講一些比較常用的,其它的就由各位同學自己探索吧

    Car類定義:

    public class Car {@NotBlank // 不能為null,不能為空字符串private String manufacturer;@NotNull // 不能為null@Size(min = 2, max = 14) // 字符串長度位于2到14之間private String licensePlate;@Min(2)@Max(5) // 注意,未添加NotNull注解,所以seatCount可以為null,只有當seatCount不為null@Min @Max才會做校驗private Integer seatCount;@AssertTrue // registered不為null時,則值需是trueprivate Boolean registered;// groups用于指定所屬的校驗組@AssertTrue(message = "The car has to pass the vehicle inspection first", groups = CarChecks.class)private Boolean passedVehicleInspection;@Valid // 表明應對driver對象內字段繼續做校驗@NotNullprivate Driver driver;@Valid // 表明應對passengers里的Person對象內字段繼續做校驗@Size(max = 2) // 表明passengers最多只能有兩個對象private List<Person> passengers = new ArrayList<>();private String brand;@Range(min = 2,max = 4) // 作用同@Min @Maxprivate Integer doors;private CarTypeEnum carTypeEnum;// get set...... }

    Driver類定義:

    public class Driver extends Person {@NotNull@Min(value = 18, message = "必須年滿18歲", groups = DriverChecks.class)public Integer age;@NotNull@AssertTrue(message = "必須具有駕照", groups = DriverChecks.class)public Boolean hasDrivingLicense;// get set...... }

    Person類定義:

    public class Person {private long personId = 0;@NotBlank@CheckCase(value = CaseMode.UPPER, message = "名字必須為大寫")private String name;public Address address;public Date birthday;// get set...... }

    RentalCar類定義:

    @GroupSequence({RentalChecks.class, CarChecks.class, RentalCar.class}) public class RentalCar extends Car {@AssertFalse(message = "The car is currently rented out", groups = RentalChecks.class)private boolean rentalStation = true;// get set...... }

    注意各個類上添加的注解

    測試代碼:

    public class ValidationTest {private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();@Testpublic void test() {// 可以試著給不同字段賦值查看校驗效果Car car = new Car();car.setManufacturer("benz");car.setLicensePlate("234234");car.setSeatCount(5);car.setRegistered(true);car.setPassedVehicleInspection(true);Driver driver = new Driver();driver.setName("JACK");driver.setAge(11);driver.setHasDrivingLicense(false);car.setDriver(driver);car.setPassengers(new ArrayList<>());car.setBrand("");car.setDoors(4);car.setCarTypeEnum(CarTypeEnum.BENZ);// 不傳遞校驗順序,則只校驗groups為Default的,沒有顯式在注解寫明groups屬性的,則默認為DefaultvalidateBean(car);// 校驗順序顯式傳遞validateBean(car, OrederedChecks.class);car.getDriver().setAge(20);car.getDriver().setHasDrivingLicense(true);validateBean(car, OrederedChecks.class);car.setSeatCount(1);Set<ConstraintViolation<Car>> constraintViolations3 = validator.validateProperty(car, "seatCount");System.err.println(constraintViolations3.iterator().next().getMessage());Set<ConstraintViolation<Car>> constraintViolations4 = validator.validateValue(Car.class, "registered", false);System.err.println(constraintViolations4.iterator().next().getMessage());// 校驗順序寫在bean的類注解上RentalCar rentalCar = new RentalCar();Set<ConstraintViolation<RentalCar>> constraintViolations5 = validator.validate(rentalCar);System.err.println(constraintViolations5.iterator().next().getMessage());}@Testpublic void test1() {// 測試自定義校驗注解Person person = new Person("John");Set<ConstraintViolation<Person>> constraintViolations = validator.validate(person);ConstraintViolation<Person> constraintViolation = constraintViolations.iterator().next();System.out.println(constraintViolation.getMessage());}public static <T> void validateBean(T bean, Class<?>... groups) {Set<ConstraintViolation<T>> constraintViolations = validator.validate(bean, groups);if (constraintViolations.isEmpty()) {System.out.println("校驗通過");return;}List<String> errors = new ArrayList<>(10);for (ConstraintViolation<T> constraintViolation : constraintViolations) {errors.add(constraintViolation.getPropertyPath() + constraintViolation.getMessage());}//throw new ValidationException(StringUtils.join(errors, ","));System.err.println(StringUtils.join(errors, ","));} }

    其中Person類@CheckCase是自定義的校驗,也就是說我們可以自定義自己的校驗邏輯,這里@CheckCase(value = CaseMode.UPPER, message ="名字必須為大寫")就是說字段值必須為大寫,那么要如何做呢?分三步:

    第一步:定義校驗注解

    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = CheckCaseValidator.class) //CheckCaseValidator類在下面 @Documented public @interface CheckCase {String message() default "";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};CaseMode value(); }public enum CaseMode {UPPER,LOWER; }

    第二部:編寫校驗邏輯實現

    public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {private CaseMode caseMode;@Overridepublic void initialize(CheckCase constraintAnnotation) {this.caseMode = constraintAnnotation.value();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (value == null) {return true;}if (caseMode == CaseMode.UPPER) {return value.equals(value.toUpperCase());} else {return value.equals(value.toLowerCase());}} }

    第三步:在bean添加注解即可生效

    public class Person {private long personId = 0;@CheckCase(value = CaseMode.UPPER, message = "名字必須為大寫")private String name;public Address address;public Date birthday;// ...... }

    源碼github地址:

    jufeng98/java-master?github.com

    總結

    以上是生活随笔為你收集整理的sql2008安装时提示参数不能为空_Java Validation API,实现参数的合法性校验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精选一区二区 | 亚洲成人aaa | 国产成人高清在线 | 精品九九九九九 | 欧美激情国产精品 | 国产成人精品二区三区亚瑟 | 嫩草视屏 | 国产性猛交96 | 国产成人欧美一区二区三区91 | 国产一区免费观看 | 日本三级大全 | 青草一区 | 亚洲一区二区三区高清视频 | 夜夜骑狠狠干 | 久热99| 久热免费在线视频 | 亚洲视频在线免费播放 | 午夜在线观看免费视频 | 黄网址在线 | 草草影院国产第一页 | 污网站在线观看免费 | 黄网站在线观看视频 | 日韩在线一区二区三区 | 成人黄色短视频在线观看 | 一本大道久久a久久综合婷婷 | 东京热加勒比无码少妇 | xx在线视频| 日韩在线1| 青青青手机视频 | 少妇视频一区二区三区 | 依依成人在线 | 国产精品手机视频 | 成人免费视频国产免费网站 | 奇米影视四色在线 | 亚洲精品国产精品乱码不卡√香蕉 | 免费黄色三级 | 久久人 | 国产日韩久久久 | 午夜视频在线观看一区二区 | 精品无码久久久久久久久久 | 日韩一区二区在线播放 | 亚洲熟妇无码一区二区三区导航 | 又污又黄的视频 | 在线观看视频免费 | 国产高清不卡视频 | 57pao成人国产永久免费视频 | 一区二区三区不卡在线观看 | 美女自拍视频 | 久久中文字幕精品 | 香蕉av在线 | 国内自拍第三页 | 国产第一色 | 超碰在线网站 | 国产精品网站在线观看 | 久久伊人国产 | 男ji大巴进入女人视频 | 麻豆蜜桃wwww精品无码 | 欧美在线一区二区 | 国产精品51 | 久久av一区 | 日韩一区二区三区高清 | 亚洲一区二区三区中文字幕 | 国产性猛交╳xxx乱大交一区 | 亚洲一区二区三区四 | 蜜臀国产AV天堂久久无码蜜臀 | 成年在线观看 | 豆花av| 久久午夜国产精品 | 99视频久久 | 中国丰满老太hd | 夜色一区二区三区 | 寂寞少妇让水电工爽hd | 三级免费毛片 | av不卡高清 | h部分肌肉警猛淫文 | 欧美亚洲在线观看 | 香蕉视频一区二区 | 91最新国产 | 美女扒开腿让男生桶 | 亚洲伦理在线播放 | 日本少妇中文字幕 | 波多野结衣电影免费观看 | 久久aⅴ国产欧美74aaa | 久久精品人妻一区二区三区 | 久久人人爽人人爽人人片 | 日韩网站免费观看高清 | 伊人96 | 日本黄色免费网址 | 亚洲夜夜夜 | 特级淫片aaaaaaa级附近的 | 怡红院成人影院 | xxxxhdvideos| 日韩城人视频 | 国产每日更新 | 亚洲图片综合区 | 香蕉毛片 | 久久国精品 | 国产精品99久久久精品无码 | 亚洲一区视频 |