Статьи

КУБА 7.2 — что нового?

Седьмая версия платформы CUBA стала большим шагом вперед. Улучшения внутренней архитектуры и новая IDE создали отличную основу для дальнейших улучшений. И мы продолжаем добавлять новые функции, чтобы облегчить жизнь разработчика и сделать его работу более продуктивной.

В версии 7.2 мы внесли ряд изменений, которые могут выглядеть как серьезное обновление, но благодаря гибкости версии 7 это просто естественное развитие платформы.

Полиглот КУБА

Kotlin теперь полностью поддерживается как первоклассный язык для приложений на основе CUBA. Теперь вы можете создавать объекты, сервисы, контроллеры экрана и все другие компоненты, используя Kotlin.

Код в Kotlin позволяет вам использовать более короткие и краткие выражения, поэтому вы можете создавать приложения даже быстрее, чем раньше. Используя языковую поддержку IntelliJ IDEA в IDE, мы смогли реализовать ту же функциональность, что и для Java: контекстные инъекции, интеллектуальные подсказки, генерация кода и т. Д.

Вот пример простой сущности. Как видите, код намного короче, чем для Java, здесь нет методов получения и установки, код отлично читается и понятен.

01
02
03
04
05
06
07
08
09
10
11
12
@NamePattern("%s|name")
@Table(name = "PETCLINIC_VET")
@Entity(name = "petclinic_Vet")
class Vet : StandardEntity() {
   @NotNull
   @Column(name = "NAME", nullable = false, unique = true)
   var name: String? = null
 
   companion object {
       private const val serialVersionUID = -8600988577624886948L
   }
}

Контроллеры экрана будут хорошо знакомы всем, кто работал с CUBA раньше:

01
02
03
04
05
06
07
08
09
10
11
12
13
@UiController("petclinic_Vet.edit")
@UiDescriptor("vet-edit.xml")
@EditedEntityContainer("vetDc")
@LoadDataBeforeShow
class VetEdit : StandardEditor<Vet>() {
   @Inject
   private lateinit var vetService: VetService
 
   @Subscribe("assignVisit")
   private fun onAssignVisitClick(event: Button.ClickEvent) {
       vetService.scheduleVisit(editedEntity, LocalDateTime.now());
   }
}

И сервис:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
interface VetService {
   companion object {
       const val NAME = "petclinic_VetService"
   }
   fun scheduleVisit(vet: Vet, visitDate: LocalDateTime): Visit
}
 
 
@Service(VetService.NAME)
class VetServiceBean : VetService {
   @Inject
   private lateinit var dataManager: DataManager
 
   override fun scheduleVisit(vet: Vet, visitDate: LocalDateTime): Visit {
       //Business logic for a visit scheduling
   }
}

Код полностью совместим с Java, вы даже можете смешивать эти Kotlin и Java в одном приложении.

И, наконец, программирование на Kotlin это весело (не каламбур)!

Обновление подсистемы безопасности

Безопасность всегда важна. Мы провели тщательный анализ нашей подсистемы безопасности и решили использовать подход «отказано по умолчанию». Для тех, кто работал с CUBA раньше, это может показаться необычным, но девиз «лучше, чем потом сожалеть» невероятно актуален во время утечки персональных данных. Как обычно, мы предоставляем путь миграции для приложений, разработанных с предыдущими версиями CUBA.

Еще одна важная вещь — определения ролей времени разработки. Теперь вы можете определять правила доступа в коде Java, поэтому вам не нужно будет экспортировать определения ролей из тестовой среды и импортировать их в рабочую версию. Мы не отказываемся от традиционного определения роли времени выполнения, мы просто добавляем еще одну функцию в нашу подсистему безопасности. Вам решать, хотите ли вы использовать роли времени выполнения, времени разработки или и то, и другое.

Вот пример, который определяет правила доступа для сущностей, атрибутов и экранов:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@Role(name = "Customers Full Access")
public class CustomersFullAccessRole extends AnnotatedRoleDefinition {
 
    @EntityAccess(target = Customer.class,
            allow = {EntityOp.CREATE, EntityOp.READ, EntityOp.UPDATE, EntityOp.DELETE})
    @Override
    public EntityPermissionsContainer entityPermissions() {
        return super.entityPermissions();
    }
 
    @EntityAttributeAccess(target = Customer.class, modify = {"name", "email"})
    @Override
    public EntityAttributePermissionsContainer entityAttributePermissions() {
        return super.entityAttributePermissions();
    }
 
    @ScreenAccess(allow = {"application-demo", "demo_Customer.browse", "demo_Customer.edit"})
    @Override
    public ScreenPermissionsContainer screenPermissions() {
        return super.screenPermissions();
    }
}

Это может выглядеть более многословно, чем «традиционное» определение времени выполнения, но этот подход позволяет нам настроить более детальный доступ к различным компонентам приложения. В сочетании с недавно представленными областями применения обновленная подсистема безопасности сделает ваше приложение более безопасным.

Лучший общий пользовательский интерфейс

Мы продолжаем поддерживать и обновлять подсистему Generic UI. В этой версии мы сделали наше боковое меню по умолчанию разборным, чтобы сэкономить место на экране приложения. Вы можете увидеть это, как только вы запустите свое приложение.

Что касается внутренних элементов экрана: теперь разработчики могут определять представления в дескрипторах экрана XML, поэтому нет необходимости создавать представления в отдельном файле.

01
02
03
04
05
06
07
08
09
10
11
12
<data>
    <instance id="orderDc" class="com.company.sales.entity.Order">
        <view extends="_local">
            <property name="lines" view="_minimal">
                <property name="product" view="_local"/>
                <property name="quantity"/>
            </property>
            <property name="customer" view="_minimal"/>
        </view>
        <loader/>
    </instance>
</data>

В дополнение к этому мы добавили несколько небольших изменений, чтобы упростить работу разработчика:

  • Гибкие позиции для элементов в формах
  • Начальная сортировка для сеток
  • Выбрать / отменить выбор всей команды для сеток
  • Сочетания клавиш
  • Улучшения поля даты и времени
  • И более

Упрощенное развертывание

В этой версии вы можете настроить соединения с базой данных непосредственно в приложении. В качестве альтернативы определениям JNDI вы можете определить свойства соединения в файле app.properties .

1
2
3
4
5
6
7
cuba.dbmsType = hsql
cuba.dataSourceProvider = application
cuba.dataSource.username = sa
cuba.dataSource.password =
cuba.dataSource.dbName = petclinic
cuba.dataSource.host = localhost
cuba.dataSource.port = 9010

Эта функция делает приложение независимым от среды сервера приложений. И это становится более мощным в сочетании с пружинными профилями — еще одна особенность версии 7.2.

Профили Spring позволяют вам определять компоненты, которые будут специфичны для среды развертывания. Например, у вас могут быть разные реализации для серверов разработки и производства.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface HelloService {
    String NAME = "demo_helloService";
 
    String hello(String input);
}
 
@Service(HelloService.NAME)
@Profile("dev")
public class HelloDevServiceBean implements HelloService {
    @Override
    public String hello(String input) {
        return "Development stub: hello " + input;
    }
}
 
@Service(HelloService.NAME)
@Profile("prod")
public class HelloProdServiceBean implements HelloService {
    @Override
    public String hello(String input) {
        return "Production service: hello " + input;
    }
}

Профиль можно активировать либо в файле web.xml либо установив свойство среды spring.profiles.active в командной строке:

1
java -Dspring.profiles.active=prod -jar app.jar

Профили Spring можно применять не только к bean-компонентам, но и к файлам конфигурации. Например, вы можете определить специфичные для профиля свойства соединения с источником данных в файле <profile>-app.properties . Или укажите разные SMTP-серверы для тестовых и производственных сред. Скажите «нет», чтобы проверить электронную почту в папках входящих сообщений вашего клиента!

Обновление CUBA Studio

Все функции, упомянутые выше, поддерживаются в CUBA Studio. Наш основной инструмент разработки также находится в постоянном развитии. Мы добавляем новые функции, используем новые API IntelliJ и улучшаем алгоритмы генерации кода, пытаясь автоматизировать все, что можно автоматизировать, чтобы вам не приходилось писать повторяющийся скучный шаблонный код.

Полный список обновлений можно найти здесь , давайте рассмотрим только самые важные:

  • Новый шаблон экрана входа в систему. Теперь вы можете использовать более удобное для брендинга окно входа в систему.
  • Пользовательский интерфейс дизайнера экрана был переработан, мы разделили его панели, чтобы сохранить пространство окна IDE и позволить разработчикам видеть изменения во время редактирования макета XML.
  • Project Wizard был расширен для поддержки новых языков программирования и позволяет нам вводить дополнительную информацию, такую ​​как свойства локали и основного хранилища данных.

Вывод

С этим обновлением разработка с использованием инфраструктуры CUBA становится проще, быстрее и интереснее. С Kotlin у вас есть шанс использовать один из самых популярных языков программирования.

Развертывание в различных средах упрощается благодаря настроенным в приложении пружинным профилям и источникам данных.

Улучшения в универсальном пользовательском интерфейсе помогут вам с большей точностью воплотить в реальность фантазии дизайнера об идеальном пользовательском интерфейсе.

И мы по-прежнему сохраняем обратную совместимость инфраструктуры, поэтому обновление вашего приложения до версии 7.2 должно быть как можно более плавным.

Вы можете найти заметки о выпуске со всеми изменениями здесь .

Опубликовано на Java Code Geeks с разрешения Андрея Беляева, партнера нашей программы JCG . Смотреть оригинальную статью здесь: CUBA 7.2 — что нового?

Мнения, высказанные участниками Java Code Geeks, являются их собственными.