奶茶精Gaaa 2024-06-23 18:23 采纳率: 47.4%
浏览 8

为什么会报错,springboot?

为什么会报错,springboot?

img

img

package com.itheima.springbootquickstart.controller;

import com.itheima.springbootquickstart.pojo.Result;
import com.itheima.springbootquickstart.pojo.User;
import com.itheima.springbootquickstart.service.UserService;
import com.itheima.springbootquickstart.utils.JwtUtil;
import com.itheima.springbootquickstart.utils.Md5Util;
import com.itheima.springbootquickstart.utils.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/user")
@Validated

public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$")String password) {


//        查询用户
            User u = userService.findByUserName(username);
            if (u == null) {
//            没有占用
//            注册
                userService.register(username, password);
                return Result.success();
            } else {
//            占用
                return Result.error("用户名已被占用");
            }


        }
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$")String password){
//根据用户名查询用户
      User loginUser = userService.findByUserName(username);
//      判断用户是否存在
        if(loginUser==null){
            return Result.error("用户名错误");
        }
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())){
//登录成功
            Map<String,Object>claims=new HashMap<>();
            claims.put("id",loginUser.getUsername());
            claims.put("username",loginUser.getUsername());
            String token=JwtUtil.genToken(claims);
            return Result.success(token);

        }
        return Result.error("密码错误");
    }
//
@GetMapping("/userInfo")
    public Result<User> userInfo(){
//        根据用户名查询
    Map<String,Object>map=ThreadLocalUtil.get();
    String username=(String)map.get("username");
    User  user=userService.findByUserName(username);
    return Result.success(user);
    }

    @PutMapping("/update")
    public Result update(@RequestBody @Validated User user){
        userService.update(user);
        return Result.success();
    }
@PatchMapping("/updateAvatar")
    public Result updateAvatar(@RequestParam @URL String avatarUrl){
        userService.updateAvatar(avatarUrl);
        return Result.success();
    }
    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody  Map<String,String> params){

//        参数校验
        String oldPwd=params.get("old_pwd");
        String newPwd=params.get("new_pwd");
        String rePwd=params.get("re_pwd");

        if(!StringUtils.hasLength(oldPwd)||!StringUtils.hasLength(newPwd)||!StringUtils.hasLength(rePwd)){
            return Result.error("缺少必要参数");
        }
        //原密码是否正确
//        调用userService根据用户名拿到原密码,再用old_Pwd比对
        Map<String,Object>map=ThreadLocalUtil.get();
        String username=(String)map.get("username");
        User loginUser=userService.findByUserName(username);
        if (!loginUser.getPassword().equals(Md5Util.getMD5String(oldPwd))){
            return Result.error("原密码填写不正确");
        }
        //newPwd和rePwd是否一样
        if (!rePwd.equals(newPwd)){
            return Result.error("两次填写的新密码不一样");
        }
        userService.updatePwd(newPwd);
        return Result.success();
    }
}


package com.itheima.springbootquickstart.service.impl;

import com.itheima.springbootquickstart.mapper.UserMapper;
import com.itheima.springbootquickstart.pojo.User;
import com.itheima.springbootquickstart.service.UserService;
import com.itheima.springbootquickstart.utils.Md5Util;
import com.itheima.springbootquickstart.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
//注入一个Usermapper对象
    @Autowired
   private UserMapper userMapper;

    @Override
    public User findByUserName(String username) {
       User u= userMapper.findByUserName(username);
        return u;
    }

    @Override
    public void register(String username, String password) {
//加密处理
        String md5String= Md5Util.getMD5String(password);
//        添加
        userMapper.add(username,md5String);
    }
//更新
    @Override
    public void update(User user) {
        user.setUpdateTime(LocalDateTime.now());
        userMapper.update(user);


    }
//更新头像
    @Override
    public void updateAvatar(String avatarUrl) {
        Map<String,Object> map=ThreadLocalUtil.get();
        Integer id=(Integer)map.get("id");
        userMapper.updateAvatar(avatarUrl,id);
    }

    @Override
    public void updatePwd(String newPwd) {
        Map<String,Object> map=ThreadLocalUtil.get();
        Integer id=(Integer)map.get("id");
        userMapper.updatePwd(Md5Util.getMD5String(newPwd),id);
    }
}


package com.itheima.springbootquickstart.service;

import com.itheima.springbootquickstart.pojo.User;

public interface UserService  {
//根据用户名查询用户
    User findByUserName(String username);
//注册
    void register(String username, String password);
//更新
    void update(User user);
//更新用户头像
    void updateAvatar(String avatarUrl);
//更新密码
    void updatePwd(String newPwd);
}


package com.itheima.springbootquickstart.pojo;


import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import lombok.NonNull;

import java.time.LocalDateTime;
@Data
public class User {
    @NotNull
    private Integer id;//主键ID
    private String username;//用户名
    @JsonIgnore//让springmvc把当前对象转换为json字符串的时候,忽略password,做种的json字段中没有password
    private String password;//密码
    @NotEmpty
    @Pattern(regexp = "^\\S{1,10}$")
    private String nickname;//昵称
    @Email
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}


package com.itheima.springbootquickstart.mapper;

import com.itheima.springbootquickstart.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserMapper {
//根据用户名查询用户
@Select("select * from user where username = #{username}")
User findByUserName(String username);

//添加
@Insert("insert into user(username, password, create_time, update_time) values(#{username}, #{password}, now(), now())")
void add(String username,String password);

//更新
@Update("update user set nickname=#{nickname},email=#{email},update_time=#{updateTime} where id=#{id}")
    void update(User user);
//更新头像
@Update("update user set user_pic=#{avatarUrl},update_time=now() where id=#{id}")
    void updateAvatar(String avatarUrl,Integer id);
//更新密码
@Update("update user set password=#{md5String},update_time=now() where id=#{id}")
void updatePwd(String md5String, Integer id);
}


img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-23 18:23
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的代码和异常信息,我们可以逐步分析并解决Spring Boot项目中的错误。

    异常分析

    异常信息为:"class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')"。这表明在代码中尝试将一个String类型的对象强制转换为Integer类型,但转换失败。

    可能的问题点

    1. 类型转换错误:在UserController.updatePwd方法中,使用ThreadLocalUtil.get()获取当前用户的ID,如果ThreadLocalUtil.get()返回的是String类型,而你尝试将其转换为Integer类型,将会导致类型转换错误。

    解决方案

    1. 检查ThreadLocalUtil.get()的返回类型:确保ThreadLocalUtil.get("id")返回的是Integer类型。如果不是,需要修改ThreadLocalUtil以存储正确的类型。

    2. 修改类型转换逻辑:如果ThreadLocalUtil.get("id")返回的是String类型,你需要先将String转换为Integer,例如使用Integer.parseInt()

    代码示例

    假设ThreadLocalUtil.get("id")返回的是String类型,你可以这样修改UserServiceImpl.updatePwd方法:

    @Override
    public void updatePwd(String newPwd) {
        Map<String,Object> map = ThreadLocalUtil.get();
        String idStr = (String) map.get("id");
        Integer id = Integer.parseInt(idStr); // 将String转换为Integer
        userMapper.updatePwd(Md5Util.getMMD5String(newPwd), id);
    }
    

    其他注意事项

    • 确保UserController.updatePwd方法中的参数校验逻辑正确,特别是old_pwdnew_pwdre_pwd的非空校验。
    • 确保userService.updatePwd(newPwd);调用正确,并且UserServiceUserServiceImpl中的updatePwd方法实现正确。

    图片内容分析

    由于我无法直接查看图片内容,你可以根据上述异常信息和解决方案检查图片中的错误日志和相关代码。

    总结

    通过分析异常信息和代码,我们确定了可能的类型转换错误,并提供了解决方案。确保在实际环境中测试这些更改,以验证问题是否得到解决。

    如果你需要进一步的帮助或有其他问题,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月23日

悬赏问题

  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 如何在cst中建立这种螺旋扇叶结构
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥20 想写一个文件管理器,加载全部子文件夹后,要一级一级返回
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?