Bootstrap

普通类调用Service方法报空指针

原因:

service接口注入失败!

写了一个登录日志用来记录获取客户端的IP和传过来的account,数据库中的表是
在这里插入图片描述
因为这个方法是写在登录接口中加的,登录接口接受的是从前台传过来的一个用户对象,所以这里需要的 account 我直接从对象里面拿,我再util文件里面建了一个 LogLoginUtil 的类,这个类我加上 @Component 注解
这里讲一下 @Component

@Component讲解

@Component (把普通pojo实例化到spring容器中,相当于配置文件中的 )
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
代码方式如下

package com.step.util;

import com.step.entity.LogLogin;
import com.step.service.LogLoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;

/**
 * @author step
 * @date 2021年07月22日 17:41
 */
@Slf4j
@Component
public class LogLoginUtil {
    @Autowired
    private LogLoginService logLoginService;
    
    public LogLogin getIp(String account,HttpServletRequest httpServletRequest){

        String ip = httpServletRequest.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = httpServletRequest.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = httpServletRequest.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = httpServletRequest.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = httpServletRequest.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = httpServletRequest.getRemoteAddr();
        }
        if (ip.equals("0:0:0:0:0:0:0:1")) {
            ip = "本地";
        }
        LogLogin logLogin=new LogLogin();
        logLogin.setAccount(account);
        logLogin.setIp(ip);
        System.out.println(logLogin.toString());
        logLoginService.save(logLogin);
        return logLogin;
    }
}

发生错误以及解决方式

当不加 @Component 注解的时候,登录端我刚开始用的是 new使用这个 LogLoginUtil 方法,然后方法debug走到了 logLoginService.save(logLogin); 这一步就抛出异常,很困惑,后台打印的是这一行的会报空指针异常。
在这里插入图片描述
debug进入这个InvocableHandlerMethod方法里的异常里
在这里插入图片描述

1,解决方式

后来学长发现问题,我这里使用 @Component 注解后,登录接口我使用**@Autowired**注解注入我的util

    @Autowired
    private LogLoginUtil logLoginUtil;

方法引入 LogLoginUtil 之后,我在登录接口方法里面直接

logLoginUtil.getIp(sysUser.getAccount(),httpServletRequest);

这样使用我的登录日志方法,可以实现调用方法

2,解决方式

我不用 @Component 注解方式,当debug之后,依旧会在老地方抛出异常,我选择在我的LogLoginUtil方法中不使用 MyBatis-Plus 中的 save 方法,我在登录接口处使用这个方法
一系列操作后我返回对象
在这里插入图片描述
我在登录接口调用这个方法,并使用MyBatis-Plus 中的 save 方法来操作数据库
登录接口主要代码
在这里插入图片描述
在这里插入图片描述
这样依旧可以实现操作数据库的方式,而且也不会报空指针异常

;