Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / NoSQL, Big Data Новый топик    Ответить
 подходы к отражению объектов передачи данных / бизнес-объектов на NoSQL хранилище  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324
Есть Rest-сервис / фасад на Java, использующий JAX-RS и JAXB как нижлежащие стандарты.
Какой лучший путь сохранить пришедший экземпляр класса в NoSQL хранилище (возьмем к примеру MongoDB)?
Спрашиваю потому, что использовать предлагаемый api ниже не кажется идеальным:
BasicDBObject doc = new BasicDBObject("name", "MongoDB").
                              append("type", dto.getType()).
                              append("count", dto.getCount()));

Подходящим был бы механизм, если я мог бы разметить свой класс JPA-аннотациями и ничего не меняя подсунуть вместо реляционного хранилища хранилище NoSQL.
Впрочем, это тоже кажется странным... Ведь на сторону сервиса приходит уже готовый json, там он сначала десериализуется в java-класс, потом выходит что этот класс нужно заново сериализовать в json чтобы сохранить в таком виде в NoSQL хранилище.
MongoDB позволяет писать строку json напрямую в хранилище.
Вроде бы звучит неплохо, но возникают дополнительные аспекты и волнения по поводу того как обеспечить безопасность, валидацию приходящих данных и их структуры и т.п.

Так как же поступают "конкретные пацаны"?
Какой наилучший способ прокинуть данные от клиента через Rest-сервис на сторону NoSQL хранилища так, чтобы не получился быдло-код в виде заполнения пар ключ-значение, чтобы не пострадала безопасность и прочие аспекты?

Метод фасада Rest-сервиса:
   /** Сохраняет данные о пользователе.  
    * @param user
    * @exception JAXBException */
   @POST 
   @Path("/saveuser")
   @Produces({MediaType.APPLICATION_JSON+";charset=utf-8"})
   @Consumes({MediaType.APPLICATION_JSON+";charset=utf-8"})
   UserInfo saveUser(UserInfo user) throws JAXBException;

Data Transfer Object:
@XmlRootElement
public class UserInfo {
   private int id;
   private String login;
   private String firstName;
   private String lastName;
   private String gender;
   private int statusId;
   private String birthdate;
   private String city;
   private String address;
   private DeliveryInfo deliveryInfo;
   public java.util.Collection<ChildInfo> children;
   ...
}
25 июл 13, 12:35    [14615569]     Ответить | Цитировать Сообщить модератору
 Re: подходы к отражению объектов передачи данных / бизнес-объектов на NoSQL хранилище  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Роман Дынник,

Сейчас решаю похожую задачу. Но у меня еще хуже, т.к. база Neo4j, а она сама по себе Restful-служба, и был соблазн вообще общаться с ней напрямую из js-клиента (Ангуляр там или еще чего) без сервера посредника. Но вовремя отговорили.

В данный момент пришел к такому решению, для каждой сущности само собой специальный класс (Users, Buildings, Horses etc), для каждого такого класса сервисный клас, где есть методы add, del, getByName etc, оперирующие экземплярами своих классов-сущностей, все как обычно. Из клиента приходит http-запрос с json'ом, который десериализуется в соответствующий класс (использую Spring MVC, там это лихо делается), ну а дальше делаем с этим классом чего хотим, и в конце концов отдаем для БД. Т.е. json практически полностью скрывается.
25 июл 13, 13:49    [14616124]     Ответить | Цитировать Сообщить модератору
 Re: подходы к отражению объектов передачи данных / бизнес-объектов на NoSQL хранилище  [new]
Роман Дынник
Member

Откуда:
Сообщений: 3324
>> Но вовремя отговорили
Каков полный перечень аргументов?
>> ну а дальше делаем с этим классом чего хотим, и в конце концов отдаем для БД. Т.е. json практически полностью скрывается
Как именно? Через Spring Data или еще что то?
26 июл 13, 12:13    [14621171]     Ответить | Цитировать Сообщить модератору
 Re: подходы к отражению объектов передачи данных / бизнес-объектов на NoSQL хранилище  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Роман Дынник
>> Но вовремя отговорили
Каков полный перечень аргументов?
>> ну а дальше делаем с этим классом чего хотим, и в конце концов отдаем для БД. Т.е. json практически полностью скрывается
Как именно? Через Spring Data или еще что то?


Аргументы здесь

SpringData рассматривается, но пока я не очень поял как мапить свои (немного специфичные) данные.
Поэтому набросал (точнее набрасываю) свой небольшой временный клиент-драйвер-ORM для экспериментов:

все общение с базой происходит через Cypher-запросы, они хранятся в xml'е, затем тот или иной метод сервисного класса (getAll, getById, delById etc) вытягивает нужный Cypher-запрос и формирует готовый json-запрос (Сypher-запрос + параметры в массиве). А ответ нужным образом десиарилизуется (тут у меня возможны варианты) в объект и возвращается вызывающему.
26 июл 13, 13:09    [14621618]     Ответить | Цитировать Сообщить модератору
Все форумы / NoSQL, Big Data Ответить