springBoot的配置文件的讀取、actuator配置以及統一異常處理

一、springBoot的配置文件讀取

在項目中我們可能會把業務相關的配置會放在配置文件中,在springBoot中我們可以通過以下幾種方式讀取配置信息

1.  Environment:可以通過 Environment 的 getProperty 方法老獲取想要的配置信息,代碼如下:

@Service
public class BasicServiceImpl implements BasicInfoService {

    private final Environment environment;

    @Autowired
    public BasicServiceImpl(Environment environment) {
        this.environment = environment;
    }

    @Override
    public String getBasicInfoByEnv() {
        return environment.getProperty("server.port");
    }
}

    server.port:爲下圖中配置文件中的信息

 2. @Value:可以注入具體的的配置信息,注入的代碼如下

@Component
public class BasicInfo {

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private String applicationPort;

    public String getApplicationName() {
        return applicationName;
    }

    public void setApplicationName(String applicationName) {
        this.applicationName = applicationName;
    }

    public String getApplicationPort() {
        return applicationPort;
    }

    public void setApplicationPort(String applicationPort) {
        this.applicationPort = applicationPort;
    }
}

   使用的代碼如下:

@Service
public class BasicServiceImpl implements BasicInfoService {

    private final BasicInfo basicInfo;


    @Autowired
    public BasicServiceImpl(BasicInfo basicInfo) {
        this.basicInfo = basicInfo;
    }

    @Override
    public String getBasicInfoByConfig() {
        return basicInfo.getApplicationName();
    }
}

 通過以上兩種配置中的任意一種配置都可以實現對配置文件的讀取。

二、actuator監控

     它是Spring Boot 提供的一個用於監控和管理自身的應用信息的模塊,使用時只需要加一個依賴就可以,依賴如下:

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

   添加這個依賴後,我們啓動應用然後訪問 /actuator/health 這個鏈接,就可以看到下面的信息:

up 代表當前應用處於健康的狀態,如果是DOWN就表示當前的應用不健康。

通過下面的配置可以一些健康信息的詳情也顯示出來,配置如下:

#顯示詳細的將康信息
management.endpoint.health.show-details=always

 添加後啓動應用再次訪問 /actuator/health 這個鏈接,就可以看到下面的信息:

{
    "status":"UP",
    "components":{
        "diskSpace":{
            "status":"UP",
            "details":{
                "total":105732108288,
                "free":99814854656,
                "threshold":10485760,
                "exists":true
            }
        },
        "ping":{
            "status":"UP"
        }
    }
}

大部分端點不會暴露出來,我們可以手動配置需要暴露的端點,如果需要暴露多個端點,可以用逗號分隔,如果想要全部端點都暴露出來可以用 * 來表示,配置如下:

management.endpoints.web.exposure.include=*

如果我們需要對應用的將康狀態增加一些其他維度的數據,可以通過下面的方式實現:

@Component
public class UserHealthIndicator extends AbstractHealthIndicator {
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        builder.up().withDetail("status",true);
    }
}

添加上述代碼後,可以重啓應用,再次訪問 /actuator/health 這個鏈接,就可以看到下面的信息:

{
    "status":"UP",
    "components":{
        "diskSpace":{
            "status":"UP",
            "details":{
                "total":105732108288,
                "free":99814850560,
                "threshold":10485760,
                "exists":true
            }
        },
        "ping":{
            "status":"UP"
        },
        "user":{
            "status":"UP",
            "details":{
                "status":true
            }
        }
    }
}

其中上面的 user 部分就是我們自定義的部分。

加入我們想查看當前登錄的用戶信息,我們可以用自定義全新的端點實現,通過@EndPoint 就可以實現,代碼如下:

@Component
@Endpoint(id="user")
public class UserEndPoint {

    @ReadOperation
    public List<Map<String,Object>> health(){
        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        map.put("userId",1001);
        map.put("userName","admin");
        list.add(map);
        return list;
    }
}

添加上述代碼後,可以重啓應用,再次訪問 /actuator/user 這個鏈接,就可以看到下面的信息:

[
    {
        "userName":"admin",
        "userId":1001
    }
]

三、統一異常處理

   有時候我們需要對一些異常要自定義返回的錯誤格式,我們可以通過下面的方式實現:

@ControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseData defaultErrorHandler(HttpServletRequest req,Exception e)throws Exception{
        logger.error("統一異常處理--------------",e);
        ResponseData responseData = new ResponseData();
        responseData.setMessage(e.getMessage());
        if(e instanceof NoHandlerFoundException){
            responseData.setCode(404);
        }else {
            responseData.setCode(500);
        }
        responseData.setData(null);
        responseData.setStatus(false);
        return responseData;
    }

}
public class ResponseData {

    private Boolean status;

    private int code;

    private String message;

    private Object data;

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

上面的代碼添加後還要在配置文件中加下面的配置:

#出現錯誤時直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
#不要爲我們的工程中的資源文件建立映射
spring.resources.add-mappings=false

這樣就完成了一個簡單的統一異常處理,當我們訪問一個不存在的接口會出現下面的情況

我們看到上面的返回信息就是我們自定義的返回信息。

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章