Мне интересно, что является предпочтительным способом отделить объект основного домена от объекта, обслуживаемого уровнем REST.Как отделить домен ядра данных от домена REST?
Я увидел на этом просветительском учебнике весны REST http://spring.io/guides/tutorials/rest/1/, что хорошо не подвергать модель основного домена непосредственно на уровне REST, поскольку она должна развиваться независимо от модели основного домена.
Основная услуга - обработка и производство событий. Эти события рассматриваются как коммуникационные порты приложения. Основная служба не видит объект домена REST. И контроллер REST не видит какой-либо объект основного домена.
Чтобы упростить задачу, рассмотрим пример только одного объекта - объекта Order.
В руководстве показано, как класс домена REST домена передается запросом REST контроллеру. В свою очередь, контроллер создает объект OrderDetails, переданный в событие обработки заказа, для создания события CreateOrderEvent, которое затем передается службе, которая возвращает другое событие OrderCreatedEvent. Контроллер, наконец, создает объект заказа домена REST из возвращаемого события и отправляет его в ответ.
Мы можем видеть, что для этого одного объекта существует один класс для объекта основного домена, один класс для объекта домена REST и один класс для объекта полезной нагрузки события.
Кроме того, мы видим, что события, сидящие в ядре приложения, распространяются на некоторые базовые события, которые сильно напоминают методы HTTP. Немного удивительно видеть, что этот REST похож на материал, просачивающийся в ядро приложения, когда то, что мы пытаемся сделать в первую очередь, состоит в том, чтобы отделить ядро приложения от слоя REST.
Любые мысли об этом дизайне или альтернативном дизайне? Есть ли какой-либо предпочтительный способ достижения этой развязки?
Спасибо за любое предложение.
С наилучшими пожеланиями,
Stephane
Еще один вопрос теперь у меня есть ...
Должен ли я пойти на исключение объект NotFoundException или для члена notFoundEntity событий в случае, на REST домен, выделенный из домена данных?
Событие, отправленное обратно на контроллер, может нести состояние члена notFoundEntity, которое может использоваться в контроллере.
Вот notFoundEntity событие логика:
protected boolean notFoundEntity = false;
public boolean isNotFoundEntity() {
return notFoundEntity;
}
public static OneAdminEvent notFound(Long id) {
OneAdminEvent oneAdmiEvent = new OneAdminEvent(id);
oneAdmiEvent.notFoundEntity = true;
return oneAdmiEvent;
}
служба обновляет состояние участника событий в зависимости от сущности того, были найдены или нет:
Admin admin = adminRepository.findOne(deleteAdminEvent.getId());
if (admin == null) {
return AdminDeletedEvent.notFound(deleteAdminEvent.getId());
В контроллере, вызов проверки для лица, которое было найдено или нет:
if (adminDeletedEvent.isNotFoundEntity()) {
}
Это соответствует развязывающий дизайн.
Но, я не уверен, что событие развязки должно содержать эту информацию.Эту информацию можно рассматривать как исключение, исключение для бизнеса.
Кроме того, с помощью исключения позволяет указать атрибут отката в транзакционной аннотации:
@Transactional(rollbackFor = NotFoundException.class)
С исключением, только не найдено объектом логика слева на службе, это событие не содержит Любые.
Служба теперь выглядит следующим образом:
Admin admin = adminRepository.findOne(deleteAdminEvent.getId());
if (admin == null) {
throw new NotFoundException("No admin was found with the id " + deleteAdminEvent.getId());
Что эмпирическое правило использовать, чтобы решить, когда использовать государство-член в случае и когда использовать бизнес пользовательское исключение?
Я не уверен в ответе. Но я работал с openmrs, медицинской системой записи. Там, в слое REST, есть отдельный модуль, который отделен от основного приложения. Вы можете посмотреть его дизайн. – geekgugi
@geekgugi Спасибо за это, я посмотрю на их слой REST, это должно быть интересно. – Stephane
Они используют пружинный АОП. – geekgugi