今天写代码的时候,在一个controller里面。有一个service死活是注解不了。
放在其他的控制器或者类里面都没有问题。后来一点点测试,发现了问题。
先show代码:
控制器
@CrossOrigin
@RestController
@RequestMapping(value = "api/kpi/TOperLog", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class TOperLogController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private static final String TITLE = "OperLog";
private static final String TRUE = "true";
private static final String FALSE = "false";
@Autowired
private TOperationlogService sysLogService;
@AOPHandler(value = "查询")
@GetMapping("/querylogbyid/{objectId}")
public String querylogbyid(HttpServletRequest request, @PathVariable Integer objectId) {
TOperationlogEntity obj = sysLogService.QueryOperLogById(1);
return JSON.toJSONString(obj);
}
/**
* 查询日志类型集合
*
* @param request
* @return
*/
@PostMapping("/QueryOperLogTypeList")
private String QueryLogTypeList(HttpServletRequest request) {
String requestURL = VerifyUtil.trimBaseHref(request.getRequestURL().toString());
try {
List<String> list = sysLogService.QueryLogTypeList();
return RestfulTool.buildCollection(new ErrorInfo(TITLE, TRUE, JSON.toJSONString(list)), requestURL);
} catch (Exception ex) {
logger.error(String.format("内部服务器错误,修改积分计量规则失败: %s", ex.getMessage()));
return RestfulTool.buildCollection(new ErrorInfo(TITLE, FALSE, "修改积分计量规则失败"), requestURL);
}
}
/**
* 获取操作日志
* @param request
* @param type
* @param page
* @param pagesize
* @return
*/
@PostMapping("/QueryOperLogList")
private String QueryOperLogList(HttpServletRequest request,@RequestParam("type")String type,@RequestParam("page")Integer page,
@RequestParam("pagesize")Integer pagesize){
String requestURL = VerifyUtil.trimBaseHref(request.getRequestURL().toString());
try {
Pageable pageable=new PageRequest(page-1,pagesize);
Page<TOperationlogEntity> pagelist= sysLogService.QueryOperLogList(type,pageable);
return RestfulTool.buildCollection(new ErrorInfo(TITLE, TRUE, JSON.toJSONString(pagelist)), requestURL);
} catch (Exception ex) {
logger.error(String.format("内部服务器错误,获取操作日志失败: %s", ex.getMessage()));
return RestfulTool.buildCollection(new ErrorInfo(TITLE, FALSE, "获取操作日志失败"), requestURL);
}
}
}
就是这个TOperationlogService 始终注解不了。经过排除法,是因为
@AOPHandler(value = "查询") 这个APO,去掉后正常注解。
百度后有人说如果有new的时候,就无法使用spring 来进行管理了。但是代码并没有new,下面是AOP的代码。里面也使用到了TOperationlogService,但是是通过注解方式。
**
* 系统日志:切面处理类
*/
@Aspect
@Component
public class SysLogAspect {
@Autowired
private TOperationlogService sysLogService;
@Value("${tokenName}")
private String tokenName;
@Value("${tokenkey}")
private String TokenKey;
private Logger logger = LoggerFactory.getLogger(this.getClass());
//定义切点 @Pointcut
//在注解的位置切入代码
@Pointcut(value = "@annotation(com.pcitc.sii.pfm.service.AOPHandler)")
public void logPoinCut() {
}
/**
* 控制器执行完成后,添加操作日志
* @param joinPoint
*/
@After("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
try {
TOperationlogEntity oplog = new TOperationlogEntity();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod();
AOPHandler myLog = method.getAnnotation(AOPHandler.class);
if (myLog != null) {
String value = myLog.value();
oplog.setLogDec(value);//保存获取的操作
oplog.setLogTypeCode(myLog.opertype());//操作类型
}
//读取session中存储的token,从token中获取用户的信息
String tokenstr = request.getHeader(tokenName);
Claims claims = JwtUtil.parseJWT(tokenstr, TokenKey);
oplog.setUserName(claims.get("username").toString());
oplog.setUserId(Long.parseLong(claims.get("id").toString()));
oplog.setLogDate(new Date());
sysLogService.SaveOperLog(oplog);
}catch (Exception ex){
logger.error(String.format("AOP切面内部错误:{%s}",ex.getMessage()) );
}
}
}
有人给解释下为啥会出现这个情况吗