springboot中java(Springboot&Mongodb)中的java.lang.ClassCastException获取api

时间:2018-11-16 15:32:22

标签: java mongodb spring-boot

我的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) {

Exception =>

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

任何人都能说出此错误的原因

1 个答案:

答案 0 :(得分:0)

如果您定义接口方法CrudRepository<MessageField,String>

,则List<MessageField>将返回findByMessageSchemaId(String messageSchema );

因此,您尝试将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个元素。