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
这样就完成了一个简单的统一异常处理,当我们访问一个不存在的接口会出现下面的情况
我们看到上面的返回信息就是我们自定义的返回信息。
下一篇: java实现ftpServer