【问题标题】:java.lang.ClassCastException in java(Springboot & Mongodb) in springboot get apijava.lang.ClassCastException in java(Springboot & Mongodb) in springboot get api
【发布时间】:2018-11-16 15:32:22
【问题描述】:

我的 MessageFieldRepository 是

package xyz.repository;
import java.util.List;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.CrudRepository;
import xyz.models.MessageField;
public interface MessageFieldRepository extends CrudRepository<MessageField,String> {


    @Query(value="{'messageSchema' : ?0}" )
     List<Object[]> findByMessageSchemaId(String messageSchema );

}

而MssageFieldSchemaService类方法是

public JSONObject findByMessageSchema(String messageSchema) throws ParseException{
        JSONObject jsonobject = new JSONObject();

        List<Object[]> data =  messageFieldRepository.findByMessageSchemaId(messageSchema);
        JSONArray messageFieldJsonArray = new JSONArray();
        JSONObject messageFieldJsonObject = new JSONObject();
        try {
            for (Object[] alldatastore : data) {
                messageFieldJsonObject.put("dataVal", alldatastore[0]);
                messageFieldJsonObject.put("messageSchema", alldatastore[1]);
                messageFieldJsonObject.put("dataVal", alldatastore[2]);
                messageFieldJsonObject.put("messageSchema", alldatastore[3]);
                messageFieldJsonObject.put("dataVal", alldatastore[4]);

                messageFieldJsonArray.add(messageFieldJsonObject);
            }
            jsonobject.put("fields", messageFieldJsonArray);
        } catch (Exception e) {
            System.out.println(e);
        }
        return jsonobject;
    }

这是我遇到错误的那一行

for (Object[] alldatastore : data) {

异常 =>

 java.lang.ClassCastException: cubereum.models.MessageField cannot be cast to [Ljava.lang.Object;

谁能告诉我为什么会出现这个错误

【问题讨论】:

  • 可能你需要使用合适的 pojo 类而不是 Object。粘贴来自 mongo 的原始(字符串)查询结果。
  • 您是否调试过代码以查看收到错误时data 包含的内容?
  • 已经试过了,但是不行
  • 它包含两个对象,其中存在多个值
  • 我认为存储库应该返回您的cubereum.models.MessageField 实例,考虑将List&lt;Object[]&gt; 更改为List&lt;MessageField&gt;

标签: java mongodb spring-boot


【解决方案1】:

如果你定义了一个接口方法findByMessageSchemaId(String messageSchema );CrudRepository&lt;MessageField,String&gt; 将返回一个List&lt;MessageField&gt;

因此,您尝试将MessageField 转换为Object 的数组,这会产生错误。所以改变接口的返回类型:

List<MessageField> findByMessageSchemaId(String messageSchema);

和循环:

for (messageField : data) {
  // do something with messageField
}

除了你的代码有一些逻辑错误:

messageFieldJsonObject.put("dataVal", alldatastore[0]);
messageFieldJsonObject.put("messageSchema", alldatastore[1]);
messageFieldJsonObject.put("dataVal", alldatastore[2]);
messageFieldJsonObject.put("messageSchema", alldatastore[3]);
messageFieldJsonObject.put("dataVal", alldatastore[4]);

您首先将alldatastore[0] 存储在密钥dataVal 下,然后用alldatastore[2] 覆盖它,然后用alldatastore[4] 覆盖。 在 messageSchema 键下,您存储 alldatastore[1] 的值只是为了在两行之后用 alldatastore[3] 覆盖它。所以最后你有一个 JSOObject 包含两个元素,你可能希望它有 5 个。

【讨论】:

  • 我将更改所有没有问题的键,但是当我使用 MessageField 类型并对其进行迭代时,它只有一个对象
  • 你从存储库中得到了什么?一个对象,还是一个包含对象的列表?请在调试器会话中检查这一点。 messageSchema 参数是唯一标识符吗?
猜你喜欢
  • 2021-12-21
  • 2023-01-23
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2019-01-16
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多