最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot2.x 參數(shù)校驗問題小結(jié)

 更新時間:2021年08月18日 10:38:36   作者:RtxTitanV  
這篇文章主要介紹了SpringBoot2.x 參數(shù)校驗一些問題總結(jié),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

本文主要對SpringBoot2.x參數(shù)校驗進行簡單總結(jié),其中SpringBoot使用的2.4.5版本。

一、引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

二、實體類

User類:

package com.rtxtitanv.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.User
 * @description 用戶實體類
 * @date 2021/8/15 16:28
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    @NotNull(message = "id不能為空")
    private Long id;
    @Length(min = 6, max = 20, message = "用戶名長度不小于6,不超過20")
    @NotNull(message = "用戶名不能為空")
    private String username;
    @Pattern(regexp = "^[A-Z][A-Za-z0-9_]{5,19}$", message = "密碼以大寫英文字母開頭,只包含英文字母、數(shù)字、下劃線,長度在6到20之間")
    @NotNull(message = "密碼不能為空")
    private String password;
    @Max(value = 60, message = "年齡最大為60")
    @Min(value = 18, message = "年齡最小為18")
    @NotNull(message = "年齡不能為空")
    private Integer age;
    @Email(message = "郵箱格式不正確")
    @NotEmpty(message = "郵箱不能為空")
    private String email;
    private String rank;
}

通用響應類:

package com.rtxtitanv.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

import java.io.Serializable;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.CommonResult
 * @description 通用響應類
 * @date 2021/8/15 17:35
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CommonResult<T> implements Serializable {

    private static final long serialVersionUID = 5231430760082814286L;
    private int code;
    private String message;
    private T data;

    public static <T> CommonResult<T> ok(String message, T data) {
        return new CommonResult<T>(HttpStatus.OK.value(), message, data);
    }

    public static <T> CommonResult<T> fail(int code, String message, T data) {
        return new CommonResult<>(code, message, data);
    }
}

三、常用的校驗注解

這里對一些用于參數(shù)校驗的常用注解進行總結(jié):

  • @Null:必須為null。
  • @NotNull:必須不為null。
  • @AssertTrue:必須為true。
  • @AssertFalse:必須為false。
  • @Min(value):必須是一個大于等于指定值的數(shù)字。
  • @Max(value):必須是一個小于等于指定值的數(shù)字。
  • @DecimalMin(value):必須是一個大于等于指定值的數(shù)字。
  • @DecimalMax(value):必須是一個小于等于指定值的數(shù)字。
  • @Size(min=,max=):大小必須在指定的范圍內(nèi)。
  • @Digits(integer, fraction):必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)。
  • @Past:必須是一個過去的日期。
  • @Future:必須是一個將來的日期。
  • @Pattern(regex=):必須符合指定的正則表達式。
  • @Email:必須是一個有效的email地址。
  • @Length(min=,max=):字符串長度是否在指定范圍內(nèi)。
  • @NotBlank:必須非空且長度大于0。
  • @NotEmpty:必須不為null或空。
  • @URL(protocol=,host,port):必須是一個有效的URL,如果提供了protocol,host等,則還需滿足提供的條件。

四、校驗Controller中的參數(shù)

1.校驗請求體

創(chuàng)建UserController,在需要校驗的參數(shù)上添加@Valid注解:

package com.rtxtitanv.controller;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.controller.UserController
 * @description UserController
 * @date 2021/8/15 16:33
 */
@RequestMapping("/user")
@RestController
public class UserController {

    @PostMapping("/save")
    public CommonResult<User> saveUser(@RequestBody @Valid User user) {
        return CommonResult.ok("保存用戶成功", user);
    }
}

啟動項目,發(fā)送如下POST請求,請求地址為http://localhost:8080/user/save

1

如果驗證失敗會拋出MethodArgumentNotValidException,默認情況下,Spring會將MethodArgumentNotValidException異常轉(zhuǎn)換為HTTP Status 400。查看控制臺打印的日志發(fā)現(xiàn)拋出了MethodArgumentNotValidException

2

創(chuàng)建全局異常處理類捕獲異常并進行處理:

package com.rtxtitanv.handler;

import com.rtxtitanv.model.CommonResult;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.handler.GlobalExceptionHandler
 * @description 全局異常處理類
 * @date 2021/8/15 16:36
 */
@RestControllerAdvice(annotations = {Controller.class, RestController.class})
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    public CommonResult<Map<String, String>> validateException(MethodArgumentNotValidException e) {
        Map<String, String> errors = new HashMap<>(16);
        e.getBindingResult().getAllErrors()
            .forEach(error -> errors.put(((FieldError)error).getField(), error.getDefaultMessage()));
        return CommonResult.fail(HttpStatus.BAD_REQUEST.value(), "無效的參數(shù)", errors);
    }
}

重啟項目后再次發(fā)送如下POST請求:

3

2.校驗請求參數(shù)

UserController上添加Validated注解并新增以下方法:

@GetMapping("/get/{id}")
public CommonResult<User>
    getUserById(@Valid @PathVariable(value = "id") @Min(value = 1, message = "id不能小于1") Long id) {
    User user = new User(id, "ZhaoYun", "A123456sd", 20, "zhaoyun123@xxx.com", "黃金");
    return CommonResult.ok("根據(jù)id查詢用戶成功", user);
}

@DeleteMapping("/delete")
public CommonResult<User> deleteByUsername(
    @Valid @RequestParam(value = "username") @Size(min = 6, max = 20, message = "用戶名長度不在指定范圍內(nèi)") String username) {
    User user = new User(1L, username, "A123456sd", 20, "zhaoyun123@xxx.com", "黃金");
    return CommonResult.ok("根據(jù)用戶名刪除用戶成功", user);
}

全局異常處理類中新增以下方法:

@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public CommonResult<Map<String, String>> handleConstraintViolationException(ConstraintViolationException e) {
    Map<String, String> errors = new HashMap<>(16);
    e.getConstraintViolations().forEach(constraintViolation -> errors
        .put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage()));
    return CommonResult.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), "無效的參數(shù)", errors);
}

發(fā)送如下GET請求,請求地址為http://localhost:8080/user/get/0

4

發(fā)送如下DELETE請求,請求地址為http://localhost:8080/user/delete?username=ZhaoZiLong_1896582826

5

五、校驗Service中的參數(shù)

通過@Validated@Valid注解組合使用不僅可以校驗Controller中的參數(shù),還可以校驗任何Spring組件中的參數(shù)。

UserService

package com.rtxtitanv.service;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.UserService
 * @description UserService
 * @date 2021/8/15 16:46
 */
@Validated
public interface UserService {
    /**
     * 更新用戶
     *
     * @param user 用戶參數(shù)
     * @return CommonResult<User>
     */
    CommonResult<User> updateUser(@Valid User user);
}

UserService實現(xiàn)類:

package com.rtxtitanv.service.impl;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.User;
import com.rtxtitanv.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.service.impl.UserServiceImpl
 * @description UserService實現(xiàn)類
 * @date 2021/8/15 16:46
 */
@Service
public class UserServiceImpl implements UserService {
    @Override
    public CommonResult<User> updateUser(User user) {
        return CommonResult.ok("更新用戶成功", user);
    }
}

UserController中新增以下代碼:

@Resource
private UserService userService;

@PutMapping("/update")
public CommonResult<User> updateUser(@RequestBody User user) {
    return userService.updateUser(user);
}

發(fā)送如下PUT請求,請求地址為http://localhost:8080/user/update

6

六、編程式校驗

通過Validator實例可以手動進行參數(shù)校驗。UserController中新增以下代碼:

@Resource
private Validator validator;

@PostMapping("/insert")
public CommonResult<User> insertUser(@RequestBody User user) {
    if (!validator.validate(user).isEmpty()) {
        throw new ConstraintViolationException(validator.validate(user));
    }
    return CommonResult.ok("添加用戶成功", user);
}

發(fā)送如下POST請求,請求地址為http://localhost:8080/user/insert

7

七、自定義校驗注解

如果自帶的校驗注解無法滿足需求,還可以自定義校驗注解。首先創(chuàng)建如下注解用于密碼校驗:

package com.rtxtitanv.annotation;

import com.rtxtitanv.validator.PasswordValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.annotation.Password
 * @description 自定義密碼校驗注解
 * @date 2021/8/16 14:54
 */
@Documented
@Constraint(validatedBy = PasswordValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Password {

    String message() default "無效密碼";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

然后創(chuàng)建ConstraintValidator接口的實現(xiàn)類并重寫isValid方法:

package com.rtxtitanv.validator;

import com.rtxtitanv.annotation.Password;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.validator.PasswordValidator
 * @description PasswordValidator
 * @date 2021/8/16 15:01
 */
public class PasswordValidator implements ConstraintValidator<Password, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        // 密碼必須以大寫英文字母開頭,只包含英文字母、數(shù)字、下劃線,長度在6到20之間
        return value.matches("^[A-Z][A-Za-z0-9_]{5,19}$");
    }
}

創(chuàng)建如下注解用于密碼校驗:

package com.rtxtitanv.annotation;

import com.rtxtitanv.validator.RankValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.annotation.Rank
 * @description 自定義用戶段位校驗注解
 * @date 2021/8/16 15:12
 */
@Documented
@Constraint(validatedBy = RankValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Rank {

    String message() default "rank值無效";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

創(chuàng)建ConstraintValidator接口的實現(xiàn)類并重寫isValid方法,:

package com.rtxtitanv.validator;

import com.rtxtitanv.annotation.Rank;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.validator.RankValidator
 * @description RankValidator
 * @date 2021/8/16 15:18
 */
public class RankValidator implements ConstraintValidator<Rank, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        HashSet<String> ranks = new HashSet<>();
        ranks.add("無段位");
        ranks.add("青銅");
        ranks.add("白銀");
        ranks.add("黃金");
        ranks.add("鉑金");
        ranks.add("鉆石");
        // 段位必須為無段位、青銅、白銀、黃金、鉑金、鉆石之一
        return ranks.contains(value);
    }
}

修改User類,使用自定義校驗注解:

package com.rtxtitanv.model;

import com.rtxtitanv.annotation.Password;
import com.rtxtitanv.annotation.Rank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.*;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.User
 * @description 用戶實體類
 * @date 2021/8/15 16:28
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    @NotNull(message = "id不能為空")
    private Long id;
    @Length(min = 6, max = 20, message = "用戶名長度不小于6,不超過20")
    @NotNull(message = "用戶名不能為空")
    private String username;
    @Password(message = "密碼必須以大寫英文字母開頭,只包含英文字母、數(shù)字、下劃線,長度在6到20之間")
    @NotNull(message = "密碼不能為空")
    private String password;
    @Max(value = 60, message = "年齡最大為60")
    @Min(value = 18, message = "年齡最小為18")
    @NotNull(message = "年齡不能為空")
    private Integer age;
    @Email(message = "郵箱格式不正確")
    @NotEmpty(message = "郵箱不能為空")
    private String email;
    @Rank(message = "段位必須為無段位、青銅、白銀、黃金、鉑金、鉆石之一")
    private String rank;
}

發(fā)送如下POST請求,請求地址為http://localhost:8080/user/save

8

八、分組校驗

在參數(shù)校驗時如果想針對不同的方法使用不同的校驗規(guī)則,則可以使用分組校驗。下面創(chuàng)建兩個用于分組校驗的接口:

public interface AddUserGroup {}
public interface ModifyUserGroup {}

在User類的實例域id上添加以下注解:

@NotNull(message = "id不能為空", groups = ModifyUserGroup.class)
@Null(message = "id必須為空", groups = AddUserGroup.class)

不寫groups屬性,則為默認分組。

UserController中新增以下方法:

@PostMapping("/add")
public CommonResult<User> addUser(@RequestBody @Validated(value = AddUserGroup.class) User user) {
    return CommonResult.ok("新增用戶成功", user);
}

@PutMapping("/modify")
public CommonResult<User> modifyUser(@RequestBody @Validated(value = ModifyUserGroup.class) User user) {
    return CommonResult.ok("修改用戶成功", user);
}

發(fā)送如下POST請求,請求地址為http://localhost:8080/user/add

9

發(fā)送如下PUT請求,請求地址為http://localhost:8080/user/modify

10

根據(jù)測試結(jié)果可知,方法addUser的參數(shù)使用的@Null校驗,方法modifyUser的參數(shù)使用的@NotNull校驗,成功實現(xiàn)了分組校驗。

九、嵌套的參數(shù)校驗

一個實體中嵌套一個實體時,通過在嵌套的實體類型屬性上添加@Valid注解,可以對嵌套的參數(shù)進行校驗。

Account類:

package com.rtxtitanv.model;

import com.rtxtitanv.annotation.Password;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.Account
 * @description 賬戶實體類
 * @date 2021/8/17 16:25
 */
@Data
public class Account {
    @NotNull(message = "賬戶id不能為空")
    private Long accountId;
    @Size(min = 6, max = 20, message = "賬戶名長度不小于6,不超過20")
    @NotNull(message = "賬戶名不能為空")
    private String accountName;
    @Password(message = "密碼必須以大寫英文字母開頭,只包含英文字母、數(shù)字、下劃線,長度在6到20之間")
    @NotNull(message = "賬戶密碼不能為空")
    private String accountPassword;
}

Order類:

package com.rtxtitanv.model;

import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.model.Order
 * @description 訂單實體類
 * @date 2021/8/17 16:55
 */
@Data
public class Order {
    @NotNull(message = "訂單id不能為空")
    private Long orderId;
    @NotEmpty(message = "訂單號不能為空")
    private String orderNumber;
    @NotEmpty(message = "訂單描述信息不能為空")
    private String orderDescription;
    @Valid
    private Account account;
}

OrderController

package com.rtxtitanv.controller;

import com.rtxtitanv.model.CommonResult;
import com.rtxtitanv.model.Order;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * @author rtxtitanv
 * @version 1.0.0
 * @name com.rtxtitanv.controller.OrderController
 * @description OrderController
 * @date 2021/8/17 17:00
 */
@RequestMapping("/order")
@RestController
@Validated
public class OrderController {

    @PostMapping("/save")
    public CommonResult<Order> saveOrder(@RequestBody @Valid Order order) {
        return CommonResult.ok("訂單保存成功", order);
    }
}

發(fā)送如下POST請求,請求地址為http://localhost:8080/order/save,發(fā)現(xiàn)嵌套的參數(shù)也被校驗:

11

代碼示例

Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-validatorGitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-validator

到此這篇關(guān)于SpringBoot2.x 參數(shù)校驗的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑

    詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑

    這篇文章主要介紹了詳解Mybatis-plus中更新date類型數(shù)據(jù)遇到的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java基礎(chǔ)教程之整數(shù)運算

    Java基礎(chǔ)教程之整數(shù)運算

    Java的整數(shù)運算與C語言相同,遵循四則運算規(guī)則,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)教程之整數(shù)運算的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Spring?Boot2.6.0新特性之默認禁止循環(huán)引用

    Spring?Boot2.6.0新特性之默認禁止循環(huán)引用

    Spring?Boot2.6.0為我們帶來很多好用的新特性/改進,這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認禁止循環(huán)引用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 一文搞懂Java中的線程安全與線程同步

    一文搞懂Java中的線程安全與線程同步

    線程安全指在被多個線程訪問時,程序可以持續(xù)進行正確的處理。線程同步是指程序中用于控制不同線程間操作發(fā)生相對順序的機制。本文將通過示例詳細為大家講講二者的使用,需要的可以參考一下
    2022-06-06
  • java8 stream 如何打印數(shù)據(jù)元素

    java8 stream 如何打印數(shù)據(jù)元素

    這篇文章主要介紹了java8 stream 如何打印數(shù)據(jù)元素,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • IDEA新建Springboot項目(圖文教程)

    IDEA新建Springboot項目(圖文教程)

    下面小編就為大家?guī)硪黄狪DEA新建Springboot項目(圖文教程)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringBoot 定時任務遇到的坑

    SpringBoot 定時任務遇到的坑

    這篇文章主要介紹了SpringBoot 定時任務遇到的坑,今天踩的這個坑和 cron 表達式有關(guān),文中給大家介紹了cron 表達式的解釋,需要的朋友一起看看吧
    2017-11-11
  • 使用java?-jar修改SpringBoot中application.properties的配置項

    使用java?-jar修改SpringBoot中application.properties的配置項

    這篇文章主要介紹了使用java?-jar修改SpringBoot中application.properties的配置項問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • SpringBoot調(diào)用WebService接口方法示例代碼

    SpringBoot調(diào)用WebService接口方法示例代碼

    這篇文章主要介紹了使用SpringWebServices調(diào)用SOAP?WebService接口的步驟,包括導入依賴、創(chuàng)建請求類和響應類、生成ObjectFactory類、配置WebServiceTemplate、調(diào)用WebService接口以及測試代碼,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • java跳出循環(huán)的方式匯總

    java跳出循環(huán)的方式匯總

    本文介紹了Java中三種常用的跳出循環(huán)的語句:break、continue和return,break用于完全結(jié)束循環(huán)并跳出循環(huán)體;continue用于跳過本次循環(huán)體中尚未執(zhí)行的語句,開始下一次循環(huán);return用于結(jié)束方法,每種方法給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-02-02

最新評論

平罗县| 获嘉县| 江阴市| 江油市| 荆门市| 明水县| 黑山县| 黄梅县| 宁蒗| 东阳市| 灵石县| 治县。| 金阳县| 滦平县| 临海市| 玉山县| 潞城市| 高邮市| 桐乡市| 揭西县| 电白县| 海南省| 峨边| 虎林市| 黑河市| 建昌县| 山阴县| 宜兰市| 稷山县| 康乐县| 霍州市| 崇信县| 高密市| 嘉祥县| 镇赉县| 宁阳县| 湖州市| 壶关县| 改则县| 黄平县| 奉化市|