С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.05.2019
Сообщений: 2

Проблема с Spring+Retrofit (Android)

11.05.2019, 21:11. Показов 778. Ответов 2

Студворк — интернет-сервис помощи студентам
В классе объекта Event поле pic описано как byte[], но в JSON запросе передается как строка из-за чего ругается retrofit. Как сделать так, чтобы spring подавал pic как массив?

Ошибка: Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 54 path $[0].pic

Json:
JSON
1
[{"name":"Event","description":"Really event","pic":"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","path":"C:\\Users\\Nikita\\Desktop\\test.png","price":20}]
Класс Event:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.io.FileInputStream;
import java.io.IOException;
public class Event {
    String name;
    String description;
    byte[] pic;
    String path;
    Integer price;
    
    public Event() {}
    public Event(String name, String description, Integer price, byte[] pic) {
        this.name = name;
        this.description = description;
        this.price = price;
        this.pic = pic;
    }
    public Event(String name, String description, String path, Integer price) {
        this.name = name;
        this.description = description;
        this.path = path;
        this.price = price;
        // считаем файл
         try(FileInputStream fin=new FileInputStream(this.path))
            {
                this.pic = new byte[fin.available()];
                fin.read(this.pic, 0, fin.available());
            }
         catch(IOException ex){
            }
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public byte[] getPic() {
        return this.pic;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getPath() {
        return this.path;
    }
    public void setPic(byte[] pic) {
        this.pic = pic;
    }
    public Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }
}
Контроллер на сервере Spring:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
 
import javax.servlet.http.HttpServlet;
 
import org.apache.tomcat.jni.File;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import ch.qos.logback.core.read.ListAppender;
 
@EnableAutoConfiguration
@RestController
public class EventsNameController extends HttpServlet{
    String rez="";
    ArrayList<Event> eventList = new ArrayList<Event>();
    
    public EventsNameController() {
        super();
        eventList.add(new Event("Event", "Really event", "C:\\Users\\Nikita\\Desktop\\test.png", 20));
    }
    @RequestMapping(value="/events/add",method = RequestMethod.POST)
    public Event putEvent(@RequestBody Event event){
        eventList.add(event);
        System.out.println("Добавлено мероприятие "+event.name);
        return event;
    }
    
    @RequestMapping("/events/list")
    public ArrayList<Event> getEvents(){
        return eventList;
    }
    
}
Класс на аднроид(retrofit):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
 
import static android.webkit.ConsoleMessage.MessageLevel.LOG;
 
public class IventsFragment extends Fragment {
    public static String URL="http://192.168.0.108:8080";
    View rootView;
    ListView listView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_projects, container, false);
 
        listView = (ListView) rootView.findViewById(R.id.lv_projects);
 
        new GetAsyncTask().execute();
        return rootView;
    }
 
    class GetAsyncTask extends AsyncTask {
        List<com.example.nikita.ucoin_tale.Event> eventsList;
 
        @Override
        protected Object doInBackground(Object[] objects) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            EventsService service = retrofit.create(EventsService.class);
            Call<ArrayList<Event>> call = service.getEvents();
            try {
                Response<ArrayList<com.example.nikita.ucoin_tale.Event>> userResponse = call.execute();
                eventsList = userResponse.body();
                Log.d("SEND_AND_RETURN","get list  with lenght "+eventsList.size());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        void convertImage(byte[] imageByte, String name) {
            Bitmap bmp = BitmapFactory.decodeByteArray(imageByte, 0, imageByte.length);
 
            try {
                FileOutputStream out = new FileOutputStream(name + ".png");
                bmp.compress(Bitmap.CompressFormat.PNG, 50, out);
                out.flush();
                out.close();
            } catch (Exception e) {
 
            }
        }
        @Override
        protected void onPostExecute(Object o) {
            String str="";
            ArrayList<String> names = new ArrayList<String>();
            ArrayList<String> descriptions = new ArrayList<String>();
            ArrayList<byte[]> images = new ArrayList<byte[]>();
            ArrayList<Integer> prices = new ArrayList<Integer>();
 
            if(eventsList==null) return;
            for(com.example.nikita.ucoin_tale.Event e:eventsList) {
                names.add(e.getName());
                descriptions.add(e.getDescription());
                images.add(e.getPic());
                prices.add(e.getPrice());
            }
            //Тут сохраняем изображение в файл
            for(int i = 0; i < images.size(); i++){
                convertImage(images.get(i), names.get(i));
            }
 
            // Упаковываем данные
            ArrayList<HashMap<String, Object>> data = new ArrayList<>(names.size());
            HashMap<String, Object> map;
            for (int i = 0; i < names.size(); i++) {
                map = new HashMap<>();
                map.put("names", names.get(i));
                map.put("descriptions", descriptions.get(i));
                map.put("images", images.get(i));
                map.put("prices", prices.get(i));
                data.add(map);
            }
 
            // Массив имен атрибутов, из которых будут читаться данные
            String[] from = {"names", "descriptions", "images", "prices"};
 
            // Массив идентификаторов компонентов, в которые будем вставлять данные
            int[] to = {R.id.tv1_projects, R.id.tv2_projects, R.id.iv1_projects, R.id.tv3_projects};
 
            // создаем адаптер
            SimpleAdapter adapter = new SimpleAdapter(getContext(), data, R.layout.list_item, from, to);
 
// Устанавливаем адаптер для списка
            listView.setAdapter(adapter);
        }
    }
}
Интерфейс андроид:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.ArrayList;
 
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
 
/**
 * Created by teacher-samsung on 20.04.2019.
 */
public interface EventsService {
    @GET("/events/list")
    public Call<ArrayList<Event>> getEvents();
    @POST("/events/add")
    public Call<com.example.nikita.ucoin_tale.Event> putEvent(@Body com.example.nikita.ucoin_tale.Event event);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2019, 21:11
Ответы с готовыми решениями:

Spring + Basic Authentication -- Retrofit 2
Всем доброго... Воюю с настройка авторизации Spring + Basic Authentication на сервере и Retrofit 2 на клиенте... Пака что...

Retrofit 2 android
как разобрать такой ответ от сервера в retrofit 2 ...

Retrofit 2 android
Вопрос мой несколько тупой но не серчайте) class cGetclients{ @SerializedName(&quot;cmd&quot;) @Expose String...

2
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
11.05.2019, 23:01
так и принимай как строку, потом, где надо разберёшь в байты
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
12.05.2019, 11:29
вопрос конечно немного не по теме, но зачем в мобильное приложение передавать это

JSON
1
"path":"C:\\Users\\Nikita\\Desktop\\test.png"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2019, 11:29
Помогаю со студенческими работами здесь

Запрос retrofit 2 android studio
как в retrofit 2 выполнить такой запрос? или в advanced rest client не могу понять, куда добавлять вот это curl -ikX ...

Spring for android
Всем доброго дня! Не давно начал изучать spring и для этого воспользовался книгой. Прочитав уже небольшую часть книги я понял, что это...

Android App и Spring Security
Здравствуйте. Столкнулся с проблемой при разработке android клиента, который общается с сервером на Spring. Написал полностью рабочий...

Android xamarin, Android 7 - проблема с Wi-Fi в спящем режиме
Люди добрые, помогите, дело в том что я написал программу для работы которой необходим Wi-Fi, проблема состоит в том что когда я перевожу...

RESTful-сервиса с Spring for Android POST запрос
Здравствуйте коллеги. Отправляю GET запрос на сервер: private class DTOTask extends AsyncTask&lt;Void, Void, DTO&gt; { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru