原因:
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 方法来操作数据库
登录接口主要代码
这样依旧可以实现操作数据库的方式,而且也不会报空指针异常