欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springBoot的配置文件的读取、actuator配置以及统一异常处理

程序员文章站 2024-03-24 08:11:10
...

一、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:为下图中配置文件中的信息

springBoot的配置文件的读取、actuator配置以及统一异常处理

 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 这个链接,就可以看到下面的信息:

springBoot的配置文件的读取、actuator配置以及统一异常处理

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

这样就完成了一个简单的统一异常处理,当我们访问一个不存在的接口会出现下面的情况springBoot的配置文件的读取、actuator配置以及统一异常处理

我们看到上面的返回信息就是我们自定义的返回信息。