1. @ControllerAdvice可对controller中被 @RequestMapping注解的方法加一些逻辑处理,一般是配合@ExceptionHandler来全局捕获异常。
1) 假设我们有TestController:
package com.bas.controller;
import com.bas.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
public class TestController {
@Autowired
private TestService testService;
@RequestMapping(value = "/bas/test", method = RequestMethod.GET)
public Boolean test(@RequestParam(value="param1",defaultValue = "value1") String str1,
@RequestParam(value="param2",defaultValue = "value2") String str2) {
return testService.test(str1, str2);
}
}
2) 因为错误的类型可以有很多种,这里我们使用Enum来枚举:
package com.bas.collection.common.enums;
public enum ExceptionMessageEnum {
UNKNOWN_EXCEPTION(500,"未知错误");
private final Integer code;
private final String message;
ExceptionMessageEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
3) 然后是一个异常处理器:
package com.bas.exception;
import com.bas.common.enums.ExceptionMessageEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public String exceptionHandler(HttpServletRequest request, Exception e) {
logger.info("\nurl:[{}],\n", request.getRequestURL());
logger.error("an exception occurs ", e);
return ExceptionMessageEnum.UNKNOWN_EXCEPTION.getMessage();
}
}
更详细的例子也可以参考Spring的@ExceptionHandler和@ControllerAdvice统一处理异常。
2. @Profile
比如我这篇文章结合使用Springboot JMS 与 Amazon SQS 标准队列 写的JmsConfiguration。当我们启动项目的时候,这个JMS会自动启动监听器了,而这个JMS又依赖服务器上的特有权限 比如访问资源,那么当我们本地没有权限时执行unit-test的话就不能正常启动了。这个时候加上注解@Profile({"stg", "dev", "prod"}) 就可以很好地解决问题了,如图:

3. @Value
假设我们项目的properties里面配置的属性的值是以 , 分割。properties如下:
bas.tables=table1,table2,table3
可以像下面这样注入:
@Value("#{'${bas.tables}'.split(',')}")
private List<String> tableNameList;
本文详细介绍了Spring框架中@ControllerAdvice与@ExceptionHandler的使用,用于全局捕获和处理异常,以及@Profile和@Value注解的应用场景。通过具体代码示例,展示了如何配置异常处理器并实现动态属性注入。
780

被折叠的 条评论
为什么被折叠?



