鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: mumei2018

[已解决]请问运行springboot工程后出现这样的报错是什么原因

[复制链接]
 楼主| 发表于 2024-3-20 14:57:12 | 显示全部楼层
FishC 发表于 2024-2-9 04:26
很好,你已经找到了问题的原因。根据你的描述,`findByUserName()`方法在service实现类中返回了`null` ...

小助理 你可以联网吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-20 14:57:21 | 显示全部楼层
mumei2018 发表于 2024-03-20 14:57
小助理 你可以联网吗?


非常抱歉,作为一个文本AI助手,我无法直接访问互联网。我只是根据预先编写好的知识库来回答问题。但是,我会尽力提供准确和有用的信息,帮助您解决问题。如果遇到了需要联网查询的问题,我建议您使用您的计算机或其他设备进行在线搜索,以获取更详细和实时的信息。如果您有任何其他问题,我会尽力回答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:36:46 | 显示全部楼层
FishC 发表于 2024-2-9 04:26
很好,你已经找到了问题的原因。根据你的描述,`findByUserName()`方法在service实现类中返回了`null` ...

请逐行解释下列代码的意义和作用

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

        @Autowired
        private EmployeeService employeeService;

       
        @PostMapping
        public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
               
                String password = employee.getPassword();
                password = DigestUtils.md5DigestAsHex(password.getBytes());
               
                LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(Employee::getUsername, employee.getUsername());
                Employee emp = employeeService.getOne(queryWrapper);
               
                if(emp == null) {
                        return R.error("用户不存在");
                }
               
                if(!emp.getPassword().equals(password)) {
                        return R.error("密码错误");
                }
               
                if(emp.getStatus()==0) {
                        return R.error("账号已禁用");
                }
               
                request.getSession().setAttribute("employee", emp.getId());
                return R.success(emp);
               
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 11:37:14 | 显示全部楼层
mumei2018 发表于 2024-03-23 11:36
请逐行解释下列代码的意义和作用

@Slf4j
@RestCon ...


这段代码是一个使用Spring Boot和Spring MVC框架的员工信息控制器类。下面逐行解释代码的意义和作用:

1. `@Slf4j`:这是一个Lombok库提供的注解,用于自动生成日志记录器变量,简化了在类中手动创建Logger对象的过程。

2. `@RestController`:这是一个Spring MVC注解,表示该类是一个RESTful风格的控制器类,用于处理HTTP请求和响应。

3. `@RequestMapping("/employee")`:指定了该控制器类的根路径为"/employee",也就是该控制器处理的请求路径必须以"/employee"开头。

4. `@Autowired`:这是Spring框架提供的注解,用于自动装配依赖。在本代码中,将`employeeService`属性自动装配为一个实现了`EmployeeService`接口的bean。

5. `@PostMapping`:表示该方法处理HTTP POST请求。

6. `public R login(HttpServletRequest request, @RequestBody Employee employee)`:定义了一个名为`login`的公共方法,该方法接收一个`HttpServletRequest`对象和一个`Employee`对象作为参数,并返回一个名为`R`的对象。这里的`R`类型可以是自定义的类,用于返回响应结果。

7. `String password = employee.getPassword();`:从传入的`Employee`对象中获取密码。

8. `password = DigestUtils.md5DigestAsHex(password.getBytes());`:使用MD5算法对密码进行加密。

9. `LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();`:创建一个MyBatis Plus提供的查询条件包装器对象。

10. `queryWrapper.eq(Employee::getUsername, employee.getUsername());`:设置查询条件,要求查询结果中的用户名与传入的用户名相等。

11. `Employee emp = employeeService.getOne(queryWrapper);`:通过调用`employeeService`对象的`getOne()`方法,根据查询条件从数据库中获取一个`Employee`对象。

12. `if(emp == null) { return R.error("用户不存在"); }`:如果查询结果为空,返回一个错误消息,表示用户不存在。

13. `if(!emp.getPassword().equals(password)) { return R.error("密码错误"); }`:如果查询结果中的密码与加密后的密码不匹配,返回一个错误消息,表示密码错误。

14. `if(emp.getStatus()==0) { return R.error("账号已禁用"); }`:如果查询结果中的账号状态为禁用状态(status为0),返回一个错误消息,表示账号已被禁用。

15. `request.getSession().setAttribute("employee", emp.getId());`:将员工ID存储在HTTP会话中,以便后续使用。

16. `return R.success(emp);`:如果以上条件都满足,返回一个成功响应,携带查询到的员工信息。

这段代码实现了一个简单的员工登录接口,接收员工的用户名和密码,并进行验证。根据验证结果返回不同的响应。希望这个解释对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:43:03 | 显示全部楼层
FishC 发表于 2024-3-23 11:37
这段代码是一个使用Spring Boot和Spring MVC框架的员工信息控制器类。下面逐行解释代码的意义和作用:
...

请详细解释下列代码的原理

                String password = employee.getPassword();
                password = DigestUtils.md5DigestAsHex(password.getBytes());
               
                LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(Employee::getUsername, employee.getUsername());
                Employee emp = employeeService.getOne(queryWrapper);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 11:43:20 | 显示全部楼层
mumei2018 发表于 2024-03-23 11:43
请详细解释下列代码的原理

                String password = em ...


这段代码主要用于验证员工的登录信息。我们逐行解释其原理:

1. `String password = employee.getPassword();`:从传入的`Employee`对象中获取密码。

2. `password = DigestUtils.md5DigestAsHex(password.getBytes());`:将获取到的密码使用MD5算法进行加密。在这里,`DigestUtils.md5DigestAsHex()`方法是Spring框架提供的工具方法,用于对字节数组进行MD5加密,并将结果转换为16进制字符串。

3. `LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();`:创建一个`LambdaQueryWrapper`对象,这是MyBatis Plus提供的查询条件包装器。

4. `queryWrapper.eq(Employee::getUsername, employee.getUsername());`:向查询条件包装器中设置一个等于条件,要求查询结果中的用户名与传入的用户名相等。`Employee::getUsername`表示获取`Employee`对象的`username`属性的值。

5. `Employee emp = employeeService.getOne(queryWrapper);`:通过调用`employeeService`对象的`getOne()`方法,根据查询条件从数据库中获取一个满足条件的`Employee`对象。

以上代码的原理是,首先从传入的`Employee`对象中获取密码,并对密码进行加密。然后创建一个查询条件包装器对象,并设置查询条件:要求查询结果中的用户名与传入的用户名相等。最后,通过调用数据库操作(`employeeService.getOne(queryWrapper)`)获取满足查询条件的员工对象。

这段代码的作用是验证员工登录信息,并根据验证结果返回不同的响应。如果数据库中存在满足用户名和密码条件的员工对象,则登录成功;反之,登录失败。希望这个解释能够帮助你理解代码的原理!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 11:53:56 | 显示全部楼层
FishC 发表于 2024-3-23 11:37
这段代码是一个使用Spring Boot和Spring MVC框架的员工信息控制器类。下面逐行解释代码的意义和作用:
...

请问这样写的好处是什么
这种用户登录方法
我直接用employeeService.findByUserName 再通过EmployeeMapper接口 从数据库里找到相应数据并封装成Employees对象 返回给控制类 再调取该对象的password值 与输入的password比对 不是更简单明了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 11:54:20 | 显示全部楼层
mumei2018 发表于 2024-03-23 11:53
请问这样写的好处是什么
这种用户登录方法
我直接用 ...


你提到的另一种实现方式也是可以的,通过直接调用`employeeService.findByUserName`方法,再从数据库中获取相应数据并封装成`Employee`对象来进行验证。这种方式也是有效的,并且可以更简洁明了。以下是使用你提到的方式来实现登录的代码示例:

  1. @PostMapping
  2. public R login(HttpServletRequest request, @RequestBody Employee employee){
  3.     Employee emp = employeeService.findByUserName(employee.getUsername());
  4.    
  5.     if(emp == null) {
  6.         return R.error("用户不存在");
  7.     }
  8.   
  9.     String password = employee.getPassword();
  10.     String encryptedPassword = DigestUtils.md5DigestAsHex(password.getBytes());
  11.    
  12.     if(!emp.getPassword().equals(encryptedPassword)) {
  13.         return R.error("密码错误");
  14.     }

  15.     if(emp.getStatus()==0) {
  16.         return R.error("账号已禁用");
  17.     }

  18.     request.getSession().setAttribute("employee", emp.getId());
  19.     return R.success(emp);
  20. }
复制代码


两种方式都可以实现用户登录功能,选择哪种方式取决于你的项目需求和个人偏好。前面解释的方式使用了MyBatis Plus的查询条件包装器,可以在查询时更加灵活地添加条件,同时也展示了如何处理加密的密码比对,以及使用`@RequestBody`注解将请求体中的JSON数据映射为`Employee`对象。而你提到的方式则更加简洁明了,直接调用服务层方法获取数据库中的数据进行比对。

总之,选择哪种方式取决于具体的业务需求和开发团队的技术栈偏好。希望这样能够帮助你更好地理解和选择适合自己的方式。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 12:04:49 | 显示全部楼层
FishC 发表于 2024-3-23 11:43
这段代码主要用于验证员工的登录信息。我们逐行解释其原理:

1. `String password = employee.getPa ...

请解释 这里为什么用
password = DigestUtils.md5DigestAsHex(password.getBytes());

如果用以下代码不是更简单明了吗?
password = Md5Util.getMD5String(password);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 12:05:02 | 显示全部楼层
mumei2018 发表于 2024-03-23 12:04
请解释 这里为什么用
password = DigestUtils.md5Di ...


在这段代码中,使用 `DigestUtils.md5DigestAsHex(password.getBytes())` 和 `Md5Util.getMD5String(password)` 都是为了对密码进行 MD5 加密。两者的实现原理和结果都是一样的。但为什么选择使用 `DigestUtils.md5DigestAsHex(password.getBytes())` 呢?

这是因为 `DigestUtils` 是 Spring 框架提供的一个工具类,它封装了常用的加密算法的实现,包括 MD5。使用这个工具类,可以更方便地进行密码的加密操作,并且不需要额外引入其他第三方库。

而 `Md5Util` 则是一个自定义的工具类,它可能是由开发者自己编写的,或者是从其他地方引入的。虽然这个工具类也能实现相同的功能,但可能需要额外的配置和引入,以及对该工具类的可靠性和安全性进行评估。

所以,选择使用 `DigestUtils.md5DigestAsHex(password.getBytes())` 的好处是:它是来自于可靠的 Spring 框架,并且无需额外的配置和引入,可以直接使用,简洁明了。当然,如果你已经在项目中使用了 `Md5Util` 类,并且对它的可靠性和安全性有信心,那么使用 `Md5Util.getMD5String(password)` 也是可以的。

最终的选择取决于你的项目需求和个人喜好。希望这个解释能够帮助你理解为什么选择了 `DigestUtils.md5DigestAsHex(password.getBytes())`。如还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表