Я разрабатываю архитектуру своего приложения REST, используя шаблон Domain Driven Design и Adapter (есть интерфейсы и множество реализаций в совокупном корне). Все в порядке, если не добавлять HATEOAS к головоломке. В HATEOAS мои объекты-значения (в нижней части иерархии зависимостей) должны зависеть от ресурсов (в верхнем слое). Это портит все. Я новичок в HATEOAS, поэтому, возможно, я что-то упускаю. Я планирую использовать декларативное связывание Dropwizard и Jersey.
Вот схема моей архитектуры:
Небольшое уточнение: эти «Типы возврата и атрибутов» между интерфейсами и объектами-значениями на самом деле должны быть «Типы возврата и аргумента». Это означает, что все методы интерфейсов берут объекты из модуля «Объекты-значения». в качестве аргументов и вернуть эти объекты вызывающей стороне.
Я могу добавить кусок кода, который покажет вам, что в каком модуле:
REST — ресурсы по JAX-RS
@Component
@Path("/groups")
@Produces(MediaType.APPLICATION_JSON)
public class GroupsResource {
@Autowired
ProcessEngine processEngine; //interface with driver implementation under it
@GET
@Timed
public List<UserGroup> getUserGroups(@Auth BpmUser user) {
return processEngine.getUserGroups(user.id);
}
}
Интерфейс ProcessEngine
public interface ProcessEngine {
void init();
List<UserGroup> getUserGroups(String username);
}
Реализация в модуле драйверы
public class ActivitiProcessEngine implements ProcessEngine {
private org.activiti.engine.ProcessEngine processEngine;
private DataSource dataSource;
private String databaseType;
public ActivitiProcessEngine(String databaseType, DataSource dataSource) {
this.databaseType = databaseType;
this.dataSource = dataSource;
}
@Override
public void init() {
if (processEngine != null)
throw new ProcessEngineAlreadyInitializedException();
try {
processEngine = createProcessEngineConfiguration().buildProcessEngine();
ProcessEngines.registerProcessEngine(processEngine);
} catch (SQLException e) {
throw new ProcessEngineDatabaseException(e);
}
}
@Override
public List<UserGroup> getUserGroups(String username) {
return processEngine
.getIdentityService()
.createGroupQuery()
.groupMember(username)
.list()
.stream()
.map(Group::getId)
.map(UserGroup::new)
.collect(Collectors.toList());
}
...
}
Объект значения
public class UserGroup {
@JsonProperty
public String name;
//I want to be able add linking to another resources here
public UserGroup(String name){
this.name = name;
}
}
@InjectLink(resource=GroupsResource.class) URI u;
внутри Value Object, но можете ли вы как-то связать ее с самим ресурсом? - person Bartek Andrzejczak   schedule 03.11.2014