【问题标题】:class java.math.BigInteger cannot be cast to class java.lang.Integer (java.math.BigInteger and java.lang.Integer are in module java.base of load类 java.math.BigInteger 不能强制转换为类 java.lang.Integer(java.math.BigInteger 和 java.lang.Integer 在模块 java.base 的负载
【发布时间】:2021-10-23 07:41:18
【问题描述】:

我正在尝试为 Spring 中的 get 请求编写处理程序,但出现此错误:

类 java.math.BigInteger 不能转换为类 java.lang.String (java.math.BigInteger 和 java.lang.String 在模块 java.base 中 加载程序“引导程序”)。

请检查我的控制器类

@GetMapping("getListOfStudentsBasedOnTrainerId/{trainerId}")
public ResponseEntity<List<TrainerIdResponse>>  getListOfStudentsBasedOnTrainerId( @PathVariable int trainerId) 
        throws RecordNotFoundException{
    
    List<TrainerIdResponse> trainerIdresp= userService.getListOfStudentsBasedOnTrainerId(trainerId);
    return new ResponseEntity<List<TrainerIdResponse>>(trainerIdresp,new HttpHeaders(), HttpStatus.OK);
    
}

这是用户服务方法

 public List<TrainerIdResponse> getListOfStudentsBasedOnTrainerId(@PathVariable int trainerId) throws RecordNotFoundException{
        
        List<Object> trainerIdResponse=searchRepository.getListOfStudentsBasedOnTrainerId(trainerId);
        Iterator it =trainerIdResponse.iterator();
         List<TrainerIdResponse> trainerIdList  =new ArrayList<>();
         while(it.hasNext()) {
             Object[] row=(Object[])it.next();
             TrainerIdResponse trainerIdResponse1= new TrainerIdResponse();
             trainerIdResponse1.setStudentid(Integer.valueOf((Integer)row[0]).intValue());
             trainerIdResponse1.setStudentname(String.valueOf(row[1]));
             trainerIdResponse1.setStudentImage(String.valueOf(row[2]));
             trainerIdResponse1.setEnrolleddate(String.valueOf(row[3]));
             trainerIdResponse1.setHighereducation(String.valueOf(row[4]));
             trainerIdResponse1.setUniversity(String.valueOf(row[5]));
             trainerIdResponse1.setEmployement(String.valueOf(row[6]));
             trainerIdResponse1.setLocation(String.valueOf(row[7]));
             trainerIdResponse1.setTrainerid(Integer.valueOf((Integer)row[8]).intValue());
             trainerIdList.add(trainerIdResponse1);
             
             
         }
        
        
        return trainerIdList;
        
    }

我的搜索库类

   @Query(value ="select u.userid as \"studentid\",u.username as \"studentname\",u.Image_url as \"studentImage\",u.addeddate as \"enrolleddate\", u.highestqualification as \"highereducation\",\r\n"
            + "u.college as \"university\",e.employmenttype as \"employement\",e.location,\r\n"
            + "ur.requestedtoid as \"trainerid\" from users u JOIN userexperience e  \r\n"
            + "on u.userid = e.userid  join userrequests ur on u.userid = ur.requestedtoid \r\n"
            + "where u.userid = ur.requestedtoid or u.userid =:trainerId",nativeQuery = true)
    List<Object> getListOfStudentsBasedOnTrainerId(int trainerId);

我的响应类

import java.util.Date;

public class TrainerIdResponse {

    private int studentid;
    private String studentname;
    private String studentImage;
    private String enrolleddate;
    private String highereducation;
    private String university;
    private String employement;
    private String location;
    private int trainerid;
    
    
    public int getStudentid() {
        return studentid;
    }
    public void setStudentid(int studentid) {
        this.studentid = studentid;
    }
    public String getStudentname() {
        return studentname;
    }
    public void setStudentname(String studentname) {
        this.studentname = studentname;
    }
    public String getStudentImage() {
        return studentImage;
    }
    public void setStudentImage(String studentImage) {
        this.studentImage = studentImage;
    }
    public  String getEnrolleddate() {
        return enrolleddate;
    }
    public void setEnrolleddate(String enrolleddate) {
        this.enrolleddate = enrolleddate;
    }
    public String getHighereducation() {
        return highereducation;
    }
    public void setHighereducation(String highereducation) {
        this.highereducation = highereducation;
    }
    public String getUniversity() {
        return university;
    }
    public void setUniversity(String university) {
        this.university = university;
    }
    public String getEmployement() {
        return employement;
    }
    public void setEmployement(String employement) {
        this.employement = employement;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public int getTrainerid() {
        return trainerid;
    }
    public void setTrainerid(int trainerid) {
        this.trainerid = trainerid;
    }
    
    
    
}

【问题讨论】:

  • 请发布您的堆栈跟踪的屏幕截图。您发布的内容似乎不是完整的堆栈跟踪,甚至不是完整的消息。这很可能是您的列是数字的问题,但您的 POJO 类属性是字符串类型(反之亦然)
  • { "statusCode": 500, "timestamp": "2021-08-22T19:20:16.873+00:00", "message": "方法参数类型所需的请求参数 'trainerId' int 不存在", "description": "uri=/users/getListOfStudentsBasedOnTrainerId/6" }
  • 您的错误很可能出现在表达式(Integer)row[0](和row[8])中。看起来您的数据库将这些字段存储为BigInteger,而不是Integer,但您正试图将其转换为整数。此外,Integer.valueOf((Integer)x) 是多余的。相当于(Integer)x
  • @BharatChaudhari row[0].getClass()row[8].getClass() 是什么?
  • @BharatChaudhari 您正在使用 row[0] 和 row[8],他们要求您使用 getClass() 检查类的内容。您还被要求发布 StackTrace。旁注:为什么标题中的错误与您的帖子正文中的错误不同?

标签: java spring api spring-mvc


【解决方案1】:

cmets 中有很多“噪音”,因此有这个“响应”:

  1. 问:实际的错误信息是什么?
  • 你的头衔:

class java.math.BigInteger 不能转换为 class java.lang.Integer (java.math.BigInteger 和 java.lang.Integer 在模块 java.base 中 加载

  • 你的身体:

类 java.math.BigInteger 不能转换为类 java.lang.String (java.math.BigInteger 和 java.lang.String 在模块 java.base 中 加载程序“引导程序”)。

??这是什么????

  1. 问:是哪一行导致了错误?

    • 这是要求您提供堆栈回溯的一个重要原因:回溯将显示源代码中发生错误的位置。
    • 可能的猜测:

trainerIdResponse1.setStudentid(Integer.valueOf((Integer)row[0]).intValue()); trainerIdResponse1.setTrainerid(Integer.valueOf((Integer)row[8]).intValue());

  1. Q:如果猜对了,底层数据库中row[0]和row[8]的数据类型是什么?它们是否对应Java“BigInteger”?

  2. 不能将“BigInteger”转换为整数。这可能是你的全部问题。你可以使用BigInteger.intValue()

示例: int myInt = myBigInteger.intValue();

  1. 最后,如果数据库中的基础值确实对应于 Java BigInteger,您不能使用“intValue()”来读取它。您可能需要getBigDecimal()

如果这些信息有帮助,请告诉我们。

请使用所有要求的信息“编辑”您的帖子。


根据 OP

private int studentid;在数据库内部,这是 bigserial 数据类型,并且 trainerid 这是里面的 db 是 int8

所以这是必要的代码:

BigInteger studentId = row[0].getBigDecimal();
trainerIdResponse1.setStudentid(studentId.intValue());
Long trainerId = row[8].getLong();
trainerIdResponse1.setTrainerid(trainerId.intValue()).

注意:两者都是narrowing conversions - 您有截断数据的风险。

【讨论】:

  • “类 java.math.BigInteger 不能转换为类 java.lang.Integer(java.math.BigInteger 和 java.lang.Integer 位于加载器'bootstrap'的模块 java.base 中)” ,这是错误
  • trainerIdResponse1.setStudentid(Integer.valueOf((Integer)row[0]).intValue()); trainerIdResponse1.setTrainerid(Integer.valueOf((Integer)row[8]).intValue());两者都是 int 数据类型
  • @BharatChaudhari 是他们吗? row[0].getClass() 给你什么?我赌 1 BTC(或任何你喜欢的货币)它 不是 Integer 并且很可能是 BigInteger。我已经在你的问题下询问了第 0 行和第 8 行的类型
  • private int studentid;在数据库里面这是 bigserial 数据类型和 trainerid 这是里面 db 是 int8
  • @Bharat Chaudhari: int8 是 Java “long”; BigSerial 是一个 Java“BigInteger”。您需要使用适当的方法(分别为getLong()getBigDecimal())从 row[] (您的数据库结果集)中读取这些值。请参阅上面的回复。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2022-01-18
  • 2020-03-11
  • 2021-07-21
  • 2016-07-26
  • 2013-08-24
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多