liuruitao647 2019-09-29 19:24 采纳率: 0%
浏览 619

关于spring boot注解的使用@Autowired

今天写代码的时候,在一个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()) );
        }
    }



}
有人给解释下为啥会出现这个情况吗
  • 写回答

2条回答 默认 最新

  • bugpool 博客专家认证 2019-09-30 08:42
    关注

    你写的Service是用接口吗?或者有报错信息吗?
    我猜测可能是代理的问题,曾经遇到问题是,当service加上@cache缓存(其实也是AOP实现)时就有问题,不加就没问题。
    主要原因是spring有2种代理,JDK跟CGLIB代理。2个的区别是JDK只代理接口,当你的service没写接口,就会出问题。
    修改方法有2中,一种是service写接口,用接口形式注入。第二种是强制开启CGLIB代理类。
    可以尝试一下。

    评论

报告相同问题?

悬赏问题

  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?