@Autowired,路径 [] 上下文中 servlet [dispatcherServlet] 的 Servlet.service() 抛出异常 [...... java.lang.NullPointerException]

问题描述 投票:0回答:1

即使将 @Autowired 添加到“private IUserService userService;”之后,我也会从运行 LoginController 的代码中收到错误。有人可以帮忙吗?非常感谢!

“路径 [] 上下文中 servlet [dispatcherServlet] 的 Servlet.service() 抛出异常 [请求处理失败;嵌套异常为 java.lang.NullPointerException],其根本原因 java.lang.NullPointerException: null"

错误信息 enter image description here

代码

@Controller
@RequestMapping("/login")
@Slf4j 
public class LoginController {


    @Autowired
//    no autowired, nullpointerexception
//    autowired, cannot receive response
    private IUserService userService;


    @RequestMapping("/toLogin") //to log in page 跳转登录页
    public String toLogin(){
        return "login";
    }


    @RequestMapping("/doLogin")
    @ResponseBody
    public RespBean doLogin(LoginVo loginVo) {
        // 接受传参 receive parameter from users with LoginVo
        return userService.doLogin(loginVo);
    }
}


public interface IUserService extends IService<User> {


    RespBean doLogin(LoginVo loginVo);


}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {


    private UserMapper userMapper;

    @Override
    public RespBean doLogin(LoginVo loginVo) {
        String mobile = loginVo.getMobile();
        String password = loginVo.getPassword();

        // check whether input is empty
        if (StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)) {
            return RespBean.error(RespBeanEnum.LOGIN_ERROR);
        }
        // check whether mobile is valid
        if (!ValidatorUtil.isMobile(mobile)) {
            return RespBean.error(RespBeanEnum.MOBILE_ERROR);
        }
        // find user with mobile
        User user = userMapper.selectById(mobile);
        if (user == null) {
            return RespBean.error(RespBeanEnum.LOGIN_ERROR);
        }

        // verify whether user password is correct
        if (!MD5Util.frontPassToDBPass(password, user.getSalt()).equals(user.getPassword())) {
            return RespBean.error(RespBeanEnum.LOGIN_ERROR);

        }
        return RespBean.success();
    }
}

如果没有@Autowired,登录页面无论如何都会用上面的NullPointerException响应用户输入。 添加@Autowired后,如果手机输入无效,则没有任何响应。如果手机和密码输入有效,登录页面将响应上面的 NullPointerException。

我尝试根据下面的网站添加 @Component 限定符,但它不起作用。

https://www.baeldung.com/spring-autowire

java spring-boot servlets nullpointerexception autowired
1个回答
0
投票
  1. 最好通过构造函数来实现bean,这样你可以在LoginController类中删除Autowired并创建一个带有必要参数的构造函数,你可以使用Lombok
  2. 由于代码没有编号,所以不清楚 npe 落在哪一行,但我可以假设在映射器中,您需要检查服务/组件注释是否在映射器类中,并创建一个构造函数服务类中的映射器
© www.soinside.com 2019 - 2024. All rights reserved.