springBoot的配置文件的读取、actuator配置以及统一异常处理 - Go语言中文社区

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

这样就完成了一个简单的统一异常处理,当我们访问一个不存在的接口会出现下面的情况

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

 

 
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39477597/article/details/106172055
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-17 02:42:38
  • 阅读 ( 627 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢