Java.lang.ClassCastException в java (Springboot и Mongodb) в springboot получить api

мой 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.

Kamil W 16.11.2018 16:36

Вы отлаживали код, чтобы увидеть, что содержится в data, когда вы получаете сообщение об ошибке?

Sofo Gial 16.11.2018 16:38

Уже пробовал, но не работает

RAHUL GUPTA 16.11.2018 16:41

он содержит два объекта, в которых присутствует несколько значений

RAHUL GUPTA 16.11.2018 16:48

Я считаю, что репозиторий должен вернуть ваши экземпляры cubereum.models.MessageField, подумайте о замене List<Object[]> на List<MessageField>

Koitoer 16.11.2018 20:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
520
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Я изменю весь ключ, который не является проблемой, но когда я использую тип MessageField и его итерацию, тогда это только один объект

RAHUL GUPTA 17.11.2018 06:42

что вы получаете из репозитория? Один объект или список с объектами? Пожалуйста, проверьте это на сессии отладчика. Является ли параметр messageSchema уникальным идентификатором?

P.J.Meisch 17.11.2018 09:58

Другие вопросы по теме