日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
異常奇談-揭示全局異常處理的神秘面紗

在今天的學(xué)習(xí)中,我們深入研究了全局異常處理,以提升系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)。通過(guò)建立全局異常處理器,我們能夠捕獲和處理應(yīng)用程序中產(chǎn)生的各種異常,并向前端返回更加友好的錯(cuò)誤信息。接下來(lái),我們將詳細(xì)介紹一些常用的全局異常處理注解,同時(shí)提供相應(yīng)的示例代碼,幫助您更好地理解和應(yīng)用這些異常處理機(jī)制。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供依安網(wǎng)站建設(shè)、依安做網(wǎng)站、依安網(wǎng)站設(shè)計(jì)、依安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、依安企業(yè)網(wǎng)站模板建站服務(wù),10余年依安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

在 Spring Boot 中,通過(guò)使用 @ControllerAdvice 注解結(jié)合不同的注解,我們可以實(shí)現(xiàn)全局異常的處理。以下是一些常用的全局異常注解的詳細(xì)介紹及示例代碼:

@ControllerAdvice
  • 作用: 聲明一個(gè)類為全局控制器增強(qiáng)類,用于集中處理異常。
  • 位置: 通常放在類的頂部,作為一個(gè)全局異常處理器的聲明。
  • 示例代碼:
@ControllerAdvice
public class GlobalExceptionHandler {
    // ...
}
@ExceptionHandler
  • 作用: 用于標(biāo)識(shí)方法為異常處理方法,處理特定類型的異常。
  • 位置: 可以放在類級(jí)別的 @ControllerAdvice 下,也可以放在普通的 Controller 類中。
  • 示例代碼:
@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception e) {
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("An unexpected error occurred: " + e.getMessage());
}
@ResponseStatus
  • 作用: 指定異常發(fā)生時(shí)返回的 HTTP 狀態(tài)碼。
  • 位置: 可以標(biāo)注在異常處理方法上,也可以標(biāo)注在自定義異常類上。
  • 示例代碼:
@ExceptionHandler(CustomException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity handleCustomException(CustomException e) {
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Custom exception: " + e.getMessage());
}
@RestControllerAdvice
  • 作用: 類似于 @ControllerAdvice,但用于 RESTful 接口的異常處理。
  • 位置: 通常放在類的頂部,作為一個(gè)全局異常處理器的聲明。
  • 示例代碼:
@RestControllerAdvice
public class RestExceptionHandler {
    // ...
}
@Validated 和 @Valid
  • 作用: 用于參數(shù)校驗(yàn),通常用于在 Controller 層進(jìn)行入?yún)⑿r?yàn)。
  • 位置: 可以標(biāo)注在方法參數(shù)上,也可以標(biāo)注在類的字段上。
  • 示例代碼:
@PostMapping("/create")
public ResponseEntity createUser(@Validated @RequestBody User user) {
    // 處理用戶創(chuàng)建邏輯
    return ResponseEntity.ok("用戶創(chuàng)建成功");
}

以上是一些常用的全局異常處理注解及參數(shù)校驗(yàn)注解的詳細(xì)介紹及示例代碼。通過(guò)合理使用這些注解,可以使全局異常處理更加靈活和規(guī)范。

讓我們開(kāi)始全局異常處理的探索之旅吧,共同深入研究如何提升系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)。通過(guò)建立全局異常處理器,我們將能夠捕獲并處理應(yīng)用程序中產(chǎn)生的各種異常,并向前端返回更加友好的錯(cuò)誤信息。

創(chuàng)建 Day 8 子模塊

首先,進(jìn)入項(xiàng)目根目錄:

cd springboot60days

創(chuàng)建 Day 8 子模塊:

mkdir day8-global-exception
cd day8-global-exception

在 Day 7 子模塊的基礎(chǔ)上,創(chuàng)建 Day 8 子模塊。在父模塊的 pom.xml 中添加 Day 8 子模塊的配置:



    day4-database-magic
    day5-mybatis-mystery
    day6-mybatis-plus-journey
    day7-data-validation
    day8-global-exception
子模塊 pom.xml 配置


    4.0.0

    
          com.icoderoad.springboot60days
          springboot60days
          1.0-SNAPSHOT
      

  day8-global-exception
  1.0-SNAPSHOT

  

      
      
          org.projectlombok
          lombok
          true
      

      
      
          org.springframework.boot
          spring-boot-starter-web
      

      
      
          org.springframework.boot
          spring-boot-starter
      

      
      
          com.baomidou
          mybatis-plus-boot-starter
          3.5.4.1
      

       
      
          org.springframework.boot
          spring-boot-starter-validation
      
    
      
      
          com.h2database
          h2
          runtime
      
  

  
      
          
              org.springframework.boot
              spring-boot-maven-plugin
          
      
  

創(chuàng)建配置文件:

在 src/main/resources 目錄下創(chuàng)建 application.properties :

# springboot60days/day8-global-exception/src/main/resources/application.properties

# Spring Boot 應(yīng)用程序名稱
spring.application.name=day8-global-exception

# 數(shù)據(jù)庫(kù)配置
spring.datasource.url=jdbc:h2:mem:userdb;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true

# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:mapper/*.xml

# 分頁(yè)插件配置
mybatis-plus.configuration.plugins=com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
mybatis-plus.configuration.plugins.pagination.type=com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor
全局異常處理器 GlobalExceptionHandler.java
// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/exception/GlobalExceptionHandler.java
package com.icoderoad.springboot60days.day8.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.List;
import java.util.stream.Collectors;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResponseEntity handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("An unexpected error occurred: " + e.getMessage());
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseEntity handleValidationException(MethodArgumentNotValidException e) {
        List fieldErrors = e.getBindingResult().getFieldErrors();
        String errorMessage = fieldErrors.stream()
                .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
                .collect(Collectors.joining(", "));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }

    @ExceptionHandler(BindException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ResponseEntity handleBindingException(BindException e) {
        List fieldErrors = e.getBindingResult().getFieldErrors();
        String errorMessage = fieldErrors.stream()
                .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
                .collect(Collectors.joining(", "));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }
}
編寫(xiě)實(shí)體類

創(chuàng)建一個(gè)具有年齡和郵箱屬性的用戶實(shí)體類 User,并在該屬性上添加 Validation 注解,進(jìn)行最大值、最小值和郵箱格式的驗(yàn)證。

// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/entity/User.java
package com.icoderoad.springboot60days.day8.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;

@Data
@TableName(value = "my_user")
public class User {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    
    @NotBlank(message = "用戶名不能為空")
    private String username;

    @Max(value = 60, message = "年齡不能大于60歲")
    @Min(value = 18, message = "年齡不能小于18歲")
    private Integer age;

    @Email(message = "郵箱格式不正確")
    private String email;

}
Mapper 接口 UserMapper.java
// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/mapper/UserMapper.java
package com.icoderoad.springboot60days.day8.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.icoderoad.springboot60days.day8.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper {
}
編寫(xiě) MyBatis-Plus Service 接口及實(shí)現(xiàn)類

創(chuàng)建一個(gè) MyBatis-Plus Service 接口 UserService 和其實(shí)現(xiàn)類 UserServiceImpl,用于處理與數(shù)據(jù)庫(kù)的交互。

UserService.java

// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/service/UserService.java
package com.icoderoad.springboot60days.day8.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.icoderoad.springboot60days.day8.entity.User;

public interface UserService extends IService {
    // 可以添加自定義業(yè)務(wù)方法...
}

UserServiceImpl.java

// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/service/impl/UserServiceImpl.java
package com.icoderoad.springboot60days.day8.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.icoderoad.springboot60days.day8.entity.User;
import com.icoderoad.springboot60days.day8.mapper.UserMapper;
import com.icoderoad.springboot60days.day8.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
    // 可以添加自定義業(yè)務(wù)方法...
}
編寫(xiě)控制器 UserController

更新 UserController 類,調(diào)用 MyBatis-Plus Service 接口處理用戶的 CRUD 操作。

// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/controller/UserController.java
package com.icoderoad.springboot60days.day8.controller;

import com.icoderoad.springboot60days.day8.entity.User;
import com.icoderoad.springboot60days.day8.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;

import java.util.List;

@RestController
@RequestMapping("/users")
@Validated
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public ResponseEntity> getAllUsers() {
        List users = userService.list();
        return new ResponseEntity<>(users, HttpStatus.OK);
    }

    @PostMapping
    public String createUser(@Valid @RequestBody User user) {
        userService.save(user);
        return "用戶創(chuàng)建成功!";
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    @PutMapping("/{id}")
    public String updateUser(@PathVariable Long id, @Valid @RequestBody User user) {
        user.setId(id);
        userService.updateById(user);
        return "用戶更新成功!";
    }

    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        userService.removeById(id);
        return "用戶刪除成功!";
    }
}
初始化類 DatabaseInitializer
// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/init/DatabaseInitializer.java
package com.icoderoad.springboot60days.day8.init;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.jdbc.core.JdbcTemplate;

@Component
public class DatabaseInitializer implements CommandLineRunner {

    private final JdbcTemplate jdbcTemplate;

    public DatabaseInitializer(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void run(String... args) throws Exception {
        // 初始化數(shù)據(jù)庫(kù)表
        jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS my_user (" +
                "id INT AUTO_INCREMENT PRIMARY KEY," +
                "username VARCHAR(255)," +
                "email VARCHAR(255)," +
                "age INT" +
                ")");
    }
}
配置類 MyBatisPlusConfig.java
// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/config/MyBatisPlusConfig.java
package com.icoderoad.springboot60days.day8.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan({"com.icoderoad.springboot60days.day8.mapper"})
public class MyBatisPlusConfig {

    /**
     * 分頁(yè)插件,自動(dòng)識(shí)別數(shù)據(jù)庫(kù)類型
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
創(chuàng)建啟動(dòng)類 Day8GlobalExceptionApplication.java:
// springboot60days/day8-global-exception/src/main/java/com/icoderoad/springboot60days/day8/Day8GlobalExceptionApplication.java
package com.icoderoad.springboot60days.day8;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Day8GlobalExceptionApplication {

    public static void main(String[] args) {
        SpringApplication.run(Day8GlobalExceptionApplication.class, args);
    }

}

Mapper 文件 UserMapper.xml




  
      
          
          
          
          
          
      

  
啟動(dòng)應(yīng)用程序:

在 day8-global-exception 子模塊的根目錄下,執(zhí)行以下命令啟動(dòng) Spring Boot 應(yīng)用程序:

mvn spring-boot:run
測(cè)試功能實(shí)現(xiàn)

在 Apifox 或 Postman 中,你可以使用以下命令測(cè)試 RESTful API 的增、刪、改、查操作:

獲取所有用戶信息(GET請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users
  • 請(qǐng)求方式:GET

創(chuàng)建用戶(POST請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users
  • 請(qǐng)求方式:POST
  • 請(qǐng)求體:
{
  "username": "icoderoad",
  "age": 25,
  "email": "icoderoad@cdxwcx.com"
}

更新用戶信息(PUT請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users/{userId}
  • 請(qǐng)求方式:PUT
  • 請(qǐng)求體:
{
  "username": "newUsername",
  "age": 26,
  "email": "newEmail@cdxwcx.com"
}

刪除用戶(DELETE請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users/{userId}
  • 請(qǐng)求方式:DELETE

測(cè)試異常處理 - 數(shù)據(jù)校驗(yàn)失敗(POST請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users
  • 請(qǐng)求方式:POST
  • 請(qǐng)求體:
{
  "username": "icoderoad",
  "age": 15,  // 年齡小于最小值
  "email": "icoderoad@cdxwcx.com"
}

測(cè)試異常處理 - 數(shù)據(jù)校驗(yàn)失?。≒UT請(qǐng)求)

  • 請(qǐng)求URL:http://localhost:8080/users/{userId}
  • 請(qǐng)求方式:PUT
  • 請(qǐng)求體:
{
  "username": "newUsername",
  "age": 8,  // 年齡小于最小值
  "email": "newEmail@cdxwcx.com"
}

測(cè)試異常處理 - 數(shù)據(jù)校驗(yàn)失敗(GET請(qǐng)求,ID為負(fù)數(shù))

  • 請(qǐng)求URL:http://localhost:8080/users/-1
  • 請(qǐng)求方式:GET

以上測(cè)試用例覆蓋了正常的 CRUD 操作以及異常處理情況,確保全局異常處理器能夠返回友好的錯(cuò)誤信息。

通過(guò)今天的學(xué)習(xí),我們成功踏上了全局異常處理的探索之旅,為提升系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)打下了堅(jiān)實(shí)的基礎(chǔ)。通過(guò)建立全局異常處理器,我們能夠更加靈活地捕獲和處理應(yīng)用程序中各種異常,從而提供更友好、更有針對(duì)性的錯(cuò)誤信息。在這一過(guò)程中,我們深入了解了一系列常用的全局異常處理注解,并通過(guò)詳細(xì)的示例代碼展示了它們的應(yīng)用方式,為今后更加自信地應(yīng)對(duì)異常情況奠定了基礎(chǔ)。


網(wǎng)站欄目:異常奇談-揭示全局異常處理的神秘面紗
分享網(wǎng)址:http://www.5511xx.com/article/djjjpje.html