Привет братья, в этот раз я поговорю со старым железом о двух проблемах, исключениях и проверке параметров. Прежде чем мы поговорим о проверке параметров, давайте поговорим об обработке исключений, потому что последняя проверка параметров будет включать в себя содержание обработки исключений.
Обработка исключений
Когда дело доходит до обработки исключений, я не знаю, писали ли вы или сталкивались ли вы со следующим способом написания.
public void saveUser() {
try {
// 所有的业务内容,目测几百行
}catch (Exception e) {
e.printStackTrace();
}
}
Если появляется приведенный выше код, он содержит много бизнес-кода. Если он написан вами, быстро измените его. Если вы его не писали, вам следует быстро его изменить.
Проблемы:
- 1. Будут обнаружены узкие места в производительности;
- 2. Трудно локализовать проблему;
- 3. Слишком большое вложение попыток очень плохо читается;
Независимо от причины приведенного выше кода, лучше изменить его.Если вам нужно попробовать в бизнес-коде, вы должны использовать try только в тех местах, где могут возникнуть исключения, а не пробовать весь бизнес-код.
Перехват исключений в SpringBoot
код напрямую
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler(value = Exception.class) // 捕获的异常类型
public Object globalException(Exception ex) {
// 异常处理
ex.printStackTrace();
return "出现异常";
}
}
Затем в SpringBoot мы можем получить место, где произошло исключение в проекте через такую конфигурацию, и мы можем получить детали класса, где произошло исключение в этом методе, так мы все используем Exception для обработки всех исключений? ткань? Тогда это точно неуместно.
Мы моделируем исключение нулем, а затем настраиваем обработчик для обработки исключения ArithmeticException Код выглядит следующим образом:
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler(value = Exception.class) // 捕获的异常类型
public Object globalException(Exception ex) {
ex.printStackTrace();
return "出现异常";
}
@ExceptionHandler(value = ArithmeticException.class)
public Object arithmeticException(ArithmeticException ex) {
ex.printStackTrace();
return "by zero异常";
}
}
Если в это время возникает исключение по нулю, используйте обработку исключений ArithmeticException, причина в том, что при меньшем диапазоне классов обработки исключений будет использоваться небольшой диапазон обработчиков исключений. Более крупный класс обработки исключений, не использующий globalException.
После этого нам не нужно писать столько попыток в проекте, что гораздо удобнее.
Фактически, помимо использования этих существующих исключений, мы также можем настроить наши исключения, такие как часто используемые исключения пользователя, не вошедшего в систему, исключения ошибок параметров и т. д. Однако, учитывая объем этой статьи, в этот раз я ее писать не буду.Заинтересованные друзья могут оставить сообщение прямо ниже.Я обновлю его, как только людей станет больше.
Обратите внимание на яму:
Вот делюсь с вами ямой, на которую наступили.Нельзя кидать исключение в фильтре Filter.Если кидать исключение в фильтре и потом обрабатывать его через класс обработки исключений,то нельзя,потому что процессор не пойман на исключение, генерируемое фильтром.
проверка параметров
Старые правила, сначала посмотрите на кусок кода
@RequestMapping(value = "/save/user")
public Object saveUser(UserPO userPO) {
if (userPO.getAge() == null) {
return "请求参数错误";
}
if (userPO.getSex() == null) {
return "请求参数错误";
}
if (userPO.getUsername() == null) {
return "请求参数错误";
}
// ...
return "SUCCESS";
}
Вы бы видели такие параметры проверки.Честно говоря, я это написал. Чем больше я пишу, тем ниже себя чувствую, поэтому будьте безжалостны и измените это как можно скорее.
@Проверенная аннотация
Эта аннотация на самом деле предоставляется Spring.Если ваш проект не является проектом SpringBoot, вам нужно указать требуемый файл pom в кавычках.Если это так, то не беспокойтесь об этом, SpringBoot уже представил его для нас.
Я прочитал много блогов в Интернете, многие из них не очень исчерпывающие, большинство из них посвящены проверке параметров JavaBean, но некоторые интерфейсы в нашем проекте могут включать параметр, и нет необходимости писать JavaBean Я пробовал много блогов и до сих пор не сказал этого, поэтому давайте проясним это на этот раз.
Проверка отдельных параметров
Просто посмотрите на код
@Validated
@RestController
public class BookController {
@RequestMapping(value = "/book/info", method = RequestMethod.GET)
public Object getBookInfo(@NotBlank(message = "书籍ID不能为空") String bookId) {
return "SUCCESS";
}
}
Здесь я хочу вам объяснить, что если это проверка одного параметра, то мы должны добавить аннотацию @Validated к классу, иначе вся наша проверка одного параметра не будет действовать.Вы можете видеть, что мы проверяем параметр bookId Когда используя @NotBlank, как следует из названия, этот параметр не может быть нулевым, и он не может быть нулевым символом после вызова метода trim().
Если параметр не соответствует требованиям, будет выдано ConstraintViolationException. Это исключение выдается только при проверке одного параметра. Если ваш параметр является JavaBean, то это исключение не является.
Теперь, когда мы знаем, что он сгенерирует исключение, и мы также знаем, какой это тип исключения, это очень просто, и мы можем напрямую использовать класс обработки исключений, который мы только что изучили выше, для обработки наших исключений.
Я нашел один относительно простой для написания.Если вы хотите написать немного посложнее, это действительно возможно, но в качестве бэк-энда я не думаю, что это необходимо, потому что мы не можем дать фронт- слишком очевидные подсказки об ошибках, чтобы другие не могли быть злонамеренными. Атака на нас подобна неправильному имени пользователя и паролю. Он не может сказать пользователю, является ли имя пользователя неправильным или пароль. Он может только предложить неправильное имя пользователя или пароль .
Если вам нужно воспроизвести подробные сообщения об ошибках, вы должны увидеть, какой параметр калибровки не прошел, или вы можете распечатать информацию об ошибке конкретного параметра следующим образом. Результатом вывода является содержимое внутри сообщения.
@RestControllerAdvice
public class ExceptionCatch {
/**
* 单个参数异常处理
*
* @param ex
* @return
*/
@ExceptionHandler(value = ConstraintViolationException.class)
public Object constraintViolationException(ConstraintViolationException ex) {
// 获取具体的错误信息
Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
// 打印数据
violations.forEach(e -> System.out.println(e.getMessage()));
return "单个-请求参数错误";
}
}
Проверка параметров JavaBean (данные формы)
Как написать JavaBean
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserPO {
@NotBlank(message = "用户名不能为空")
private String username;
@NotNull(message = "年龄不能为空")
@Min(value = 1, message = "年龄最小为1")
@Max(value = 200, message = "年龄最大为200")
private Integer age;
@NotBlank(message = "性别不能为空")
private String sex;
}
Написание контроллера
@RequestMapping(value = "/save/user")
public Object saveUser(@Validated UserPO userPO) {
// ...
return "SUCCESS";
}
В отличие от проверки с одним параметром, при проверке JavaBean необходимо писать @Validated в параметрах метода, а не в классах. Если проверка параметра не пройдена, также будет сгенерировано исключение BindException.
/**
* 一般参数校验绑定异常处理
*
* @param ex
* @return
*/
@ExceptionHandler(value = BindException.class)
public Object bindException(BindException ex) {
BindingResult bindingResult = ex.getBindingResult();
// 获取所有的错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
// 输出
allErrors.forEach(e -> System.out.println(e.getDefaultMessage()));
return "请求参数错误";
}
Примечание: каждый должен обратить внимание на почтовый запрос двумя способами: один — передача данных на основе формата данных формы, а другой — передача данных на основе формата json.Исключения, вызванные двумя методами передачи, также различаются, поэтому мы также Для отдельной обработки обработки исключений проверки параметров на основе JSON.
Проверка параметров JavaBean (json)
Давайте сначала посмотрим, как Контроллер получает
@RequestMapping(value = "/save/user")
public Object saveUser(@Validated @RequestBody UserPO userPO) {
// ...
return "SUCCESS";
}
Соответствующая обработка исключений параметров
/**
* JSON参数校验绑定异常处理
*
* @param ex
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Object methodArgumentNotValidException(MethodArgumentNotValidException ex) {
BindingResult bindingResult = ex.getBindingResult();
// 获取所有的错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
// 输出
allErrors.forEach(e -> System.out.println(e.getDefaultMessage()));
return "请求参数错误-json";
}
последние слова
Итак, наша статья подошла к концу, в ней в основном представлены две части: обработка исключений и проверка параметров. Хотя это очень просто, я лично считаю, что это очень распространенный навык. Так что поделитесь им со всеми и поставьте лайк, если это вам немного поможет. Если есть что-то, что вы не понимаете, пожалуйста, оставьте сообщение ниже, и давайте общаться вместе.
Для более интересного контента, пожалуйста, обратите внимание на паблик WeChat: рост программиста