Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request p

今天在写springboot项目的时候遇到了这样一个问题,是有关注入的,报错信息如下

2020-04-07 16:24:42.675 ERROR 10384 --- [nio-8181-exec-1]
 o.a.c.c.C.[.[.[/].[dispatcherServlet]    
 : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
	at com.gxuwz.assistant_demo.controller.LoginController.validLogin2(LoginController.java:24) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.5.RELEASE.jar:5.2.5.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_77]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_77]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.33.jar:9.0.33]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_77]

我们看一下我的代码:

LoginController

@RestController
@RequestMapping("/login")
public class LoginController {

    LoginService loginService;

    //登录校验加角色
    @GetMapping("/validLogin/{username}/{password}/{type}")
    public String validLogin2(@PathVariable("username") String user_id,
                              @PathVariable("password") String password,
                              @PathVariable("type") Integer type) {
        //根据username和password和type查询是否存在该用户
        String str = loginService.findByUserIdAndPasswordAndRoleId(user_id,password,type);
        //如果登录的用户角色是技术员,虽然用户名密码输入正确但是他选择的是实验室助理那么就返回false
        if(str!=null) {
            return "success";
        }else {
            return "error";
        }

    }
}

LoginService

public interface LoginService {

    //登录校验
    public String findByUserIdAndPasswordAndRoleId(String user_id,String pwd,Integer role_id);

}

LoginServiceImpl

public class LoginServiceImpl implements LoginService {

    @Autowired
    LoginRepositoryDao loginRepositoryDao;

    @Override
    public String findByUserIdAndPasswordAndRoleId(String user_id, String pwd, Integer role_id) {
        return loginRepositoryDao.findByUserIdAndPasswordAndRoleId(user_id,pwd,role_id);
    }

}

LoginRepositoryDao

public interface LoginRepositoryDao extends JpaRepository<SysUser,String> {

    //登录校验
    @Query(value = "select a.user_id from sys_user a,sys_user_role b where a.user_id = b.user_id and a.user_id = ? and a.password = ? and b.role_id = ?",nativeQuery = true)
    public String findByUserIdAndPasswordAndRoleId(String user_id,String pwd,Integer role_id);
}

出错的主要原因就是在LoginController中没有注入Service
那么怎么注入呢?
就要用到@Service()这个注解还有@Autowired这个注解
那么他们分别放到哪呢?怎么用呢?

1.@Service()放到Service接口的实现类上面
默认情况下注入的是Service接口名第一个字母小写loginService,如果你想自定义一个名字,那么你就要这样写@Service(“abc”),我这里自定义名字是abc。这里重点说明一下,如果你设置了自定义名字,那么你在Controller层引入的时候就要定义为LoginService 自定义的名字,并且在上方加上@Autowired这个注解

2.@Autowired放到Controller中要引入的Service的定义上方

看一下实例代码:我没有使用自定义的名字而使用默认的

LoginController

@RestController
@RequestMapping("/login")
public class LoginController {

    @Autowired
    LoginService loginService;

    //登录校验加角色
    @GetMapping("/validLogin/{username}/{password}/{type}")
    public String validLogin2(@PathVariable("username") String user_id,
                              @PathVariable("password") String password,
                              @PathVariable("type") Integer type) {
        //根据username和password和type查询是否存在该用户
        String str = loginService.findByUserIdAndPasswordAndRoleId(user_id,password,type);
        //如果登录的用户角色是技术员,虽然用户名密码输入正确但是他选择的是实验室助理那么就返回false
        if(str!=null) {
            return "success";
        }else {
            return "error";
        }

    }
}

LoginServiceImpl

@Service()
public class LoginServiceImpl implements LoginService {

    @Autowired
    LoginRepositoryDao loginRepositoryDao;

    @Override
    public String findByUserIdAndPasswordAndRoleId(String user_id, String pwd, Integer role_id) {
        return loginRepositoryDao.findByUserIdAndPasswordAndRoleId(user_id,pwd,role_id);
    }

}

再说明一下,如果你没使用@Service这个注解
那么你在LoginService上使用@Autowired会报错的,亲测

你可能感兴趣的:(Spring,Boot,学习随笔)