Есть задача - разработать модель данных для совместного использования разными приложениями Jmix.
Каким образом реализуются такого рода задачи?
Можно ли DataModel сделать общим для разных проектов приложений?
Создайте аддон и разрабатывайте общую модель в нем.
Приложения или другие аддоны смогут использовать и расширять общую модель.
С уважением,
Константин
Возможно ли где-то пример посмотреть?
Какого рода пример вы бы хотели увидеть?
Вы можете за полчаса набросать такой проект:
- Создайте новый композитный проект
- Создайте подпроект-аддон A (New → Subproject), в нем сущность Customer
- Создайте подпроект-приложение B. Настройте зависимость B от A (Settings → Dependencies Between Subprojects)
- В проекте B создавайте экраны для Customer и/или сущности, ссылающиеся на Customer.
- Создайте подпроект-приложение C. Настройте зависимость B от A. И так далее.
Спасибо, попробую.
Подскажите, как при такой архитектуре настроить беопастность? Таблица пользователей генерируется в FullStack-проекте только. (Я учусь только, прошу с пониманием отнестить)
По сути, вам пользователи не нужны для прорисовки безопасности. Посмотрите как описываются те же Ресурсные роли.
Например, базовые роли для Отчетов и прочих аддонов Jmix определяются в самом аддоне.
Где-то в подпроекте, где вы реализуете конкретный блок бизнес-логики работы с конкретными сущностями и их экранами, наверное где-то там логично и рисовать все роли для этого блока.
Там у вас для этого есть и экраны и сущности.
А в “конечном” приложении у вас создаются пользователи с их репозиторием и там вы используете эти роли.
Обновил пример с централизованным (в аддоне) управлением пользователями:
jmix-projects/sample-composite-project-2
С уважением,
Константин
Попробовал создать составной проект,
Создал составной проект, в котором описана модель данных users, добавил модуль, в котором описан person со ссылкой на users.
но столкнулся с следующим:
> Task :persons:persons:compileJava FAILED
Execution failed for task ':persons:persons:compileJava'.
> javassist.NotFoundException: io.jmix.security.authentication.JmixUserDetails
эту же проблему описывали на англоязычном форуме
вот код entity:
@JmixEntity
@Table(name = "PERS_PERSON", indexes = {
@Index(name = "IDX_PERSON_USER", columnList = "USER_ID")
})
@Entity(name = "pers_Person")
public class Person extends BaseEntity {
@JoinColumn(name = "USER_ID")
@ManyToOne(fetch = FetchType.LAZY)
private User user;
@Column(name = "BIO_ID")
private Integer bio_id;
@Column(name = "SEX", length = 5)
private String sex;
@Column(name = "BIRTHDAY")
private LocalDate birthday;
@Column(name = "FIRST_NAME", nullable = false)
@NotNull
private String firstName;
@Column(name = "LAST_NAME", nullable = false)
@NotNull
private String lastName;
@Column(name = "MIDDLE_NAME")
private String middleName;
@Column(name = "PHOTO")
private byte[] photo;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TYPE_PERSON_ID")
private TypePerson typePerson;
public Integer getBio_id() {
return bio_id;
}
public void setBio_id(Integer bio_id) {
this.bio_id = bio_id;
}
public Sex getSex() {
return sex == null ? null : Sex.fromId(sex);
}
public void setSex(Sex sex) {
this.sex = sex == null ? null : sex.getId();
}
public TypePerson getTypePerson() {
return typePerson;
}
public void setTypePerson(TypePerson typePerson) {
this.typePerson = typePerson;
}
public byte[] getPhoto() {
return photo;
}
public void setPhoto(byte[] photo) {
this.photo = photo;
}
public LocalDate getBirthday() {
return birthday;
}
public void setBirthday(LocalDate birthday) {
this.birthday = birthday;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
upd. Оказалось, что в модуле persons нужно наличие Main Data Store, c changelog:
<include file="/io/jmix/data/liquibase/changelog.xml" contextFilter="@jmix-addon"/>
<include file="/com/company/users/liquibase/changelog.xml" contextFilter="@jmix-addon"/>
(Изучил пример из поста выше) так же в persons.gradle нужно было установить зависимость:
implementation ‘io.jmix.security:jmix-security-starter’
implementation ‘io.jmix.security:jmix-security-flowui-starter’
implementation ‘io.jmix.security:jmix-security-data-starter’