powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно передать данные с сервера на клиента
27 сообщений из 27, показаны все 2 страниц
Как правильно передать данные с сервера на клиента
    #39012630
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Есть множество ентити на сервере. Есть клиенты(ios, android), которые запрашивают данные этих энтити. Вопрос: как лучше организовать трансфер данных с сервера на клиентские приложения? Вариантов как я понимаю несколько: передавать энтити напрямую, но как тогда клиентское приложение(ios например) сможет распарсить какое-то специфическое поле, например DateTime time (joda). Или что если помимо полей конкретной энтити нужно передать еще что-то. Ставить в соответствие каждой энтити некий объект, в котором будут находится все поля сущности + все остальное чего душа пожелает(дата в long например, что удобно как для андроид так и для ios), т.е. как бы приходим к паттерну DTO о котором слышала массу негативных отзывов. Как решаются подобные задачи? Спасибо
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012640
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитай про Jersey. Обьекты передаются в формате JSON а потом на клиенте/сервере преобразуются назад в объект. Единственный минус что нужно на клиенте и сервере одинаковые классы передаваемых объектов.

Можешь почитать про RMI, CORBA.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012650
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9Почитай про Jersey. Обьекты передаются в формате JSON а потом на клиенте/сервере преобразуются назад в объект. Единственный минус что нужно на клиенте и сервере одинаковые классы передаваемых объектов.

Можешь почитать про RMI, CORBA.
Сейчас у меня это работает через spring mvc + jackson, json-ами и обмениваюсь. Айос парсит полученный json, на андроид клиенте из json-а автоматом строится java класс. Мне не очень нравится при каждом добавлении нового поля в энтити, лезть в трансфер-модель, которая соответствует этой энтити, и так же добавлять поле. Поддерживать весь этот огород с сотнями энтити мучительно больно
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012666
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется услышать еще какие-то мнения по моему вопросу
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012727
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012736
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT, можно сделать модуль мавен для транзакционных объектов. И просто собираешь этот модуль и потом просто в другом проекте он автоматом подгружается.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012742
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTХочется услышать еще какие-то мнения по моему вопросу
непонятно, зачем тебе объекты на клиенте?
На каком этапе нужны Java классы?
http://habrahabr.ru/post/260317/
AFAIK там свой DataSet вроде есть для связи с БД.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39012754
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем вам дто тут? Почему не генерироватьjson из BO?
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39013934
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulTХочется услышать еще какие-то мнения по моему вопросу
непонятно, зачем тебе объекты на клиенте?
На каком этапе нужны Java классы?
http://habrahabr.ru/post/260317/
AFAIK там свой DataSet вроде есть для связи с БД.
Ну вот андроид приложение, например, для конвертации джсона в класс использует следующее:
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(http path... User.class);
Соответственно, андроид клиент должен знать класс, в то время как User является энтити, хотя если я правильно понимаю при передаче этой энтити все аннотации (@Table, @Column и т.д.) игнорируются. А если мне хочется передать на клиента не просто DateTime time из класса User, а time в формате long? В таком случае моя энтити User уже не подходит и нужно прибегать к dto и уже там крутить, вертеть как мне хочется. Можно конечно transient поля использовать, но как-не не нравится мне эта идея. В чем я заблуждаюсь?
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39013935
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ника зачем вам дто тут? Почему не генерироватьjson из BO?
Простите, ВО это что?
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39013982
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTВ чем я заблуждаюсь?
ты так и не объяснил, зачем тебе класс.
Всё равно биндить к визуальному контролу надо будет не класс.
А логика вся на сервере, иначе на клиенте тогда нужно делать свою модель данных.
ВО тоже самое что DTO - голимые данные и больше ничего.
IMHO уж лучше JSON\REST
Какая разница в чём будет дата приходить?
Ты ни слова не сказал о ГУИ для даты. А ведь у тебя клиент. Возможно со смещением по таймзоне.
.......
Т.е. проектируешь Окно с гридом.
Значит передаёшь с сервера данные именно для него. И в формате именно для него.
Зачем тебе ОРМ в андроиде я не понял.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39014165
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,

не нужно никаких классов генерировать, делайте HashMap и ArrayList <HashMap> и никакого гемороя не будет.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39014270
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ВО тоже самое что DTO - голимые данные и больше ничего.
.
Это не так. Business Object это и есть ваша Entity, то бишь User. Все ваши проблемы как-то надуманы, dto тут ни к селу ни к городу. Кастомизировать выхлоп json - разве это проблема? Вариантов масса, все зависит от технологии коих миилиард. XStream, Gson, Spring MVC
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39014331
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetro123ВО тоже самое что DTO - голимые данные и больше ничего.
.
Это не так. Business Object это и есть ваша Entity, то бишь User. Все ваши проблемы как-то надуманы, dto тут ни к селу ни к городу. Кастомизировать выхлоп json - разве это проблема? Вариантов масса, все зависит от технологии коих миилиард. XStream, Gson, Spring MVC
я спутал с Values Obj - VO
))
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39014898
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никPetro123ВО тоже самое что DTO - голимые данные и больше ничего.
.
Это не так. Business Object это и есть ваша Entity, то бишь User. Все ваши проблемы как-то надуманы, dto тут ни к селу ни к городу. Кастомизировать выхлоп json - разве это проблема? Вариантов масса, все зависит от технологии коих миилиард. XStream, Gson, Spring MVC
Я по-другому спрошу. Вот есть в моем проекте(Spring mvc+Hibernate и т.д., под андроид я не пишу) код, что-то типа:
@Entity
User
.....
@Column
String name
Для каждой такой BO создается некий UserDetails, который полностью включает в себя все поля из User + еще что-то. Именно этот UserDetails и отправляется в ввиде json-a используя Spring mvc в клиентское приложение. Андроид клиент хранит у себя класс UserDetails и когда к нему прилетает json с сервера он формирует из него (при помощи jackson) объект UserDetails. Зачем автор этого кода сделал прослойку в виде UserDetails, почему сразу не передает User? На сколько я поняла это делалось для того чтобы удобно было передавать любые другие поля помимо тех, которые хранит в себе User. Т.е., например мне помимо имени пользователя нужно передать кол-во заказов этого пользователя. Поля orderCount в User нет и в базе оно не хранится, поэтому либо добавляем его с аннотацие @transient в User и перед отправкой заполняем, либо берем UserDetails, добавляем в него orderCount и отправляем UserDetails. Мне просто очень хочется убрать всю эту груду дополнительных классов на каждый мой BO, но не уверена стоит ли это делать т.к. может быть здесь заложен глубокий и правильный смысл
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015111
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTзабыл никпропущено...

Это не так. Business Object это и есть ваша Entity, то бишь User. Все ваши проблемы как-то надуманы, dto тут ни к селу ни к городу. Кастомизировать выхлоп json - разве это проблема? Вариантов масса, все зависит от технологии коих миилиард. XStream, Gson, Spring MVC
Я по-другому спрошу. Вот есть в моем проекте(Spring mvc+Hibernate и т.д., под андроид я не пишу) код, что-то типа:
@Entity
User
.....
@Column
String name
Для каждой такой BO создается некий UserDetails, который полностью включает в себя все поля из User + еще что-то. Именно этот UserDetails и отправляется в ввиде json-a используя Spring mvc в клиентское приложение. Андроид клиент хранит у себя класс UserDetails и когда к нему прилетает json с сервера он формирует из него (при помощи jackson) объект UserDetails. Зачем автор этого кода сделал прослойку в виде UserDetails, почему сразу не передает User? На сколько я поняла это делалось для того чтобы удобно было передавать любые другие поля помимо тех, которые хранит в себе User. Т.е., например мне помимо имени пользователя нужно передать кол-во заказов этого пользователя. Поля orderCount в User нет и в базе оно не хранится, поэтому либо добавляем его с аннотацие @transient в User и перед отправкой заполняем, либо берем UserDetails, добавляем в него orderCount и отправляем UserDetails. Мне просто очень хочется убрать всю эту груду дополнительных классов на каждый мой BO, но не уверена стоит ли это делать т.к. может быть здесь заложен глубокий и правильный смысл

причин может быть много, зависит от ситуации

может просто потому что сделали.

может из за того что details было ну очень много то разделили на User и UserDetails, и поэтому чтобы каждый раз доставать из БД User может повлиять на производительность, в то время как нам нужно всеголи проверить логин пароль узнать чтобы пускать или нет User куда либо либо.

может UserDetails это не entity а просто обертка (без кода непонятно). Что удобно тк в этом случае "случайно" запороть entity User не получится если случайно сессия все еще открыта или в открытой сессиии User передается еще либо куда.

знающие люди могут дополнить этот список
и т.д.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015165
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
Для того чтобы менять архитектуру проекта, нужно быть очень опытным. Решать только вам.
Класс над классом или "впаре") то же самое что вьюхи в бд и JOIN.
Вы сказали что клиента не пишите, тогда и сабж не имеет смысла.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015288
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTЯ по-другому спрошу. Вот есть в моем проекте(Spring mvc+Hibernate и т.д., под андроид я не пишу) код, что-то типа:
@Entity
User
.....
@Column
String name
Для каждой такой BO создается некий UserDetails, который полностью включает в себя все поля из User + еще что-то. Именно этот UserDetails и отправляется в ввиде json-a используя Spring mvc в клиентское приложение. Андроид клиент хранит у себя класс UserDetails и когда к нему прилетает json с сервера он формирует из него (при помощи jackson) объект UserDetails. Зачем автор этого кода сделал прослойку в виде UserDetails, почему сразу не передает User? На сколько я поняла это делалось для того чтобы удобно было передавать любые другие поля помимо тех, которые хранит в себе User. Т.е., например мне помимо имени пользователя нужно передать кол-во заказов этого пользователя. Поля orderCount в User нет и в базе оно не хранится, поэтому либо добавляем его с аннотацие @transient в User и перед отправкой заполняем, либо берем UserDetails, добавляем в него orderCount и отправляем UserDetails. Мне просто очень хочется убрать всю эту груду дополнительных классов на каждый мой BO, но не уверена стоит ли это делать т.к. может быть здесь заложен глубокий и правильный смысл

А ну в таком случае промежуточный слой скорее всего нужен. По факту у вас есть BusinessObject User, который занимает определенное место в domain model с определенным количеством атрибутов и операций. Клиенту же нужно его специфическое представление, которое для разных клиентов теоретически может быть и разным, в таком случае введение промежуточного слоя в виде DTO зачастую оправдано. К тому же делать business object частью публичного API тоже не самая лучшая идея. Если же клиент мейнтейнится одними и теми же людьми, что и сервер, и дрягих клиентов не предполагается, чтобы уменьшить сложность, слой DTO иногда выкидывают, зависит от ситуации, общих советов тут быть не может.
В целом я не вижу большой проблемы в перекладывании User в UserDetails, если там большинство полей одинаковые, в конце концов есть такая штука как Dozer. UserDetails ud = entityMapper.map(user, UserDetails.class);
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015616
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос : а как вы создаете DTO объекты в spring ? используя spring data ?

https://rmannibucau.wordpress.com/2013/11/20/deltaspike-data-repositories-with-dtos/

через Mapper ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@ApplicationScoped
public class UserMapper extends SimpleQueryInOutMapperBase<User, UserDto> {
    @Override
    protected UserDto toDto(final User user) {
        final UserDto userDto = new UserDto();
        userDto.setName(user.getName());
        userDto.setId(user.getId());
        return userDto;
    }
 
    @Override
    protected User toEntity(final UserDto dto) {
        final User user = new User();
        user.setName(dto.getName());
        // I chose to not set the id here but it could be done
        return user;
    }
}
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015656
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
ParameterizedRowMapper для JdbcTemplate

а для spring data Repository ? что то уже есть?
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015734
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulTЯ по-другому спрошу. Вот есть в моем проекте(Spring mvc+Hibernate и т.д., под андроид я не пишу) код, что-то типа:
@Entity
User
.....
@Column
String name
Для каждой такой BO создается некий UserDetails, который полностью включает в себя все поля из User + еще что-то. Именно этот UserDetails и отправляется в ввиде json-a используя Spring mvc в клиентское приложение. Андроид клиент хранит у себя класс UserDetails и когда к нему прилетает json с сервера он формирует из него (при помощи jackson) объект UserDetails. Зачем автор этого кода сделал прослойку в виде UserDetails, почему сразу не передает User? На сколько я поняла это делалось для того чтобы удобно было передавать любые другие поля помимо тех, которые хранит в себе User. Т.е., например мне помимо имени пользователя нужно передать кол-во заказов этого пользователя. Поля orderCount в User нет и в базе оно не хранится, поэтому либо добавляем его с аннотацие @transient в User и перед отправкой заполняем, либо берем UserDetails, добавляем в него orderCount и отправляем UserDetails. Мне просто очень хочется убрать всю эту груду дополнительных классов на каждый мой BO, но не уверена стоит ли это делать т.к. может быть здесь заложен глубокий и правильный смысл

Добавлю свои 5 копеек. User может быть замешан в разных непохожих друг на друга бизнес-операциях. И могут быть созданы несколько сервисов, которые будут возвращать данные о пользователе относительно какой-то операции. По каждой такой операции могут быть необходимы свои уникальные сведения о пользователе. Здесь пригодятся DTO. Под каждую операцию свой, чтобы не смешивать и, читая код, сразу понимать, какие сведения должны передаваться. Если в коде сервиса дописывать что-то к json вручную, то это совсем не удобочитаемо. Вот как-то так.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015756
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще допишу. В DTO могут быть поля, значения, которых не просто вытаскиваются из какого-то поля в БД, а вычисляются по мере необходимости. Таких полей может не быть в классе доменной модели. В DTO может передаваться дополнительная информация, непосредственно к объекту не относящаяся. Например, с товаром - список похожих товаров. Это к вопросу об использовании DTO.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015760
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelenaЕсли в коде сервиса дописывать что-то к json вручную, то это совсем не удобочитаемо. Вот как-то так.
imho
В вебе очень много значит Url - универсальный указатель ресурса.
Если не мешать всё в кучу (все сервисы).
/<URL‐путь>?<параметры>#<якорь>
если принять <URL‐путь> как ИмяФункции\ИмяСервиса, то можно спокойно передать на клиента JSON.
Или даже строку.
Не нужны тут ни DTO ни объекты)).
Они нужны в толстом клиенте.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015764
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123yelenaЕсли в коде сервиса дописывать что-то к json вручную, то это совсем не удобочитаемо. Вот как-то так.
imho
В вебе очень много значит Url - универсальный указатель ресурса.
Если не мешать всё в кучу (все сервисы).
/<URL‐путь>?<параметры>#<якорь>
если принять <URL‐путь> как ИмяФункции\ИмяСервиса, то можно спокойно передать на клиента JSON.
Или даже строку.
Не нужны тут ни DTO ни объекты)).
Они нужны в толстом клиенте.

Клиенту можно передать и JSON, и XML. И тут все равно, толстый он или тонкий. Я говорю о том, что если выставляется какой-то сервис, то к нему есть требования: что он должен передавать. И что сначала эти требования можно представить в виде DTO.
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015766
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, можно и по-простому для тонкого клиента. Только как бы потом при такой простоте в сложном проекте не заблудиться. А еще один и тот же сервис можно использовать и для тонкого, и для толстого клиента. Вам такой вариант в голову не приходил?
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39015769
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yelena,
Тут тема странная.
Аффтар спросила - Как передать данные?
Сама клиента при этом не пишет.
Вестимо что передать надо то что попросят)))) LOL.
ЗЫ.
А понапридумать и накрутить _серерный программист_ может столько! ))
На будущее его, его детей и клиентов его детей.
Удачи!
...
Рейтинг: 0 / 0
Как правильно передать данные с сервера на клиента
    #39021586
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, весьма познавательно получилось :)
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно передать данные с сервера на клиента
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]