概览

该文档列出 CUBA 平台版本 7.2 的主要改动。

Warning

请注意,如要使用 CUBA 7.2,您需要先 安装 Studio 13 或更新的版本。之前的 Studio 版本不能正确处理新版本的项目创建、迁移以及热部署。

所有解决的问题

破坏性改动

  1. 由于登录的 "remember me - 记住我" 机制发生了变化(参考下面介绍),在升级后所有用户都需要在登录时重新输入凭证,现象与 cookie 被删除一样。

  2. LoginScreen 类进行了重构,简化了创建 新登录窗口 的实现过程。内部类 AuthInfo 移至 LoginScreenAuthDelegate,所以如果您已经扩展了登录界面并且重写这个同名方法,需要对 import 做一定修改,例如:

    public class ExtLoginScreen extends LoginScreen {
        @Override
        protected void setAuthInfo(LoginScreenAuthDelegate.AuthInfo authInfo) {
        // ...
  3. 由于 SideMenu 组件的改动,使用了这种菜单的主界面需要使用 cssLayout 作为根容器。如果您的项目中有非响应式侧边菜单的主界面,Studio 会在自动迁移中将根容器 hbox 替换为 cssLayout。如果主界面的布局有问题,请确认根容器是否正确,示例:

    <window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd"
            extends="/com/haulmont/cuba/web/app/main/main-screen.xml">
        <layout>
            <cssLayout id="horizontalWrap">
                <workArea id="workArea">
                <!-- -->
  4. 由于引入了 安全范围,删除了 cuba.anonymousSessionId 应用程序属性。现在所有范围的匿名会话都使用随机标识符创建。

  5. UserSession 类有了如下改动:

    1. 在构造器中,Role 的集合替换成 RoleDefinition 的集合。

    2. 删除了 addPermission()removePermission() 方法。替换这些方法的办法就是直接操作从 UserSession 获取的权限许可关系图,示例:

      RoleDefinition joinedRole = userSession.getJoinedRole();
      Map<String, Integer> screenExplicitPermissions = joinedRole.screenPermissions().getExplicitPermissions();
      screenExplicitPermissions.put("demo_Customer.browse", 1);

      另一个办法是用 BasicRoleDefinition.builder() 创建一个新的 RoleDefinition,然后用 RoleDefinitionsJoiner 与已有的角色做 join:

      RoleDefinition joinedRole = RoleDefinitionsJoiner.join(userSession.getJoinedRole(), myRole);
      userSession.setJoinedRole(joinedRole);
    3. 删除了这些方法: getConstraints(entityName)hasConstraints()addConstraint()removeConstraint()。如需查找特殊的约束,使用 getConstraints().findConstraintsByEntity()。如需添加或删除约束,使用 AccessConstraintsBuilder

      ConstraintsContainer constraintsContainer = AccessConstraintsBuilder.create()
                          .join(userSession.getConstraints())
                          .withJpql(MyEntity.class, "{E}.createdBy = :session$userLogin")
                          .build();
      userSession.setConstraints(constraintsContainer);
  6. 许多 UI 组件(比如 Label 的值和 TextField 的标题)的 HTML 内容现在默认会做清理以防止跨站脚本(XSS)。如果发现显示自定义的 HTML 有问题,可以先关掉这个清理功能,使用 cuba.web.htmlSanitizerEnabled 应用程序属性,或者在单独的组件内使用其 setHtmlSanitizerEnabled() 方法。

  7. 当使用 文件夹面板 时,Add to set - 添加至集合 操作和按钮不会在关联了通用过滤器的表格中自动显示。如果需要该操作,按照 记录集 章节的介绍显式添加。

  8. Amazon S3 文件存储 实现已经移至单独的插件。参阅插件的 README 了解细节。

  9. JGroups 升级至 4.1.8.Final。如果您使用 中间件集群,需要对您的 JGroup 配置文件做如下改动:

    • 对于 UDP 配置,替换:

      • MERGE2MERGE3

      • pbcast.NAKACKpbcast.NAKACK2,并删除 retransmit_timeout 属性。

      • UNICASTUNICAST3

      • FCMFC

    • 对于 TCP 配置,删除属性 timer_type, timer.min_threads, timer.max_threads, timer.keep_alive_time, timer.queue_max_size, thread_pool.queue_enabled, thread_pool.queue_max_size, thread_pool.rejection_policy, oob_thread_pool.min_threads, oob_thread_pool.max_threads, oob_thread_pool.keep_alive_time, oob_thread_pool.queue_enabled, oob_thread_pool.queue_max_size, oob_thread_pool.rejection_policy 并添加属性 thread_pool.enabled="true"。更多细节参阅 这篇文章

  10. DataContext.evictAll() 重命名为 evictModified(),这个名字更加匹配其功能,只是用来清除修改过和删除的实例。如果需要清除包括修改的实例在内的所有实例,可以使用新的 clear() 方法。

  11. Icons.Icon.name() 方法重命名为 iconName()

  12. Calendar 做了泛化,需要指定特定的数据类型以便使用对应的日期类型 API(之前是直接使用 java.util.Date)。

安全子系统

  1. 重新实现了安全子系统的 权限角色,以便提供 "默认拒绝" 的模型替换之前的 "默认许可" 模型。使用 CUBA 7.2 新建的项目会默认直接使用新模型。如果从之前版本的 CUBA 迁移过来,Studio 会添加应用程序属性以保持现有的安全配置不变,参阅 遗留版本角色和许可

  2. 现在安全 角色访问组 以及权限和角色可以在设计时进行定义,通过使用带特定注解的 Java 类实现。这将使得访问控制更加健壮,并能避免在不同的应用程序实例之间同步配置(比如,从开发环境到生产环境)。注意,设计时角色只能在新的 CUBA 7.2 项目生效。如果从之前版本迁移过来,想使用设计时角色,则需要删除一些应用程序属性,并重新配置您的现有角色和许可,参阅 遗留版本角色和许可

  3. 引入了 安全范围 的概念,可以为通过不同客户端登录的用户配置不同的角色组。这个功能背后的动机是因为,REST API 客户端应当比通用 UI 的用户有更多的限制,因为通用 UI 本质上更安全。

部署

  1. 在开发和部署环境使用 应用程序主目录 已经标准化。当在 Studio 启动应用程序时,应用程序主目录创建在 deploy/app_home 目录。包含为所有应用程序 block 服务的 conftempwork 文件夹,以及通用的 logs 目录。应用程序主目录还包含一个空的 local.app.properties 文件和带有默认配置的 logback.xml

    Warning

    为了正确的使用应用程序主目录,开发阶段的 Tomcat 需要在 setenv.* 脚本中定义 app.home Java 系统属性。所以在升级到 CUBA 7.2 之后,需要删除旧的 deploy/tomcat 目录,然后才能启动应用程序。会自动安装新的 Tomcat 。

    对于各种部署环境,都推荐设置 app.home Java 系统属性,好在框架为此事做了明智的备用方案:使用 UberJAR 时,主目录为其工作目录;在 Tomcat 中使用 WAR 时,主目录为 ${catalina.base}/work/app_home,其他情况则为 ~/.app_home

  2. 可以很方便的为开发环境提供您自己的 日志配置 :只需要在项目内创建 etc/logback.xml 文件,当您启动项目时,该文件会被拷贝至 deploy/app_home,然后日志初始化程序会识别此文件。

  3. 现在可以用应用程序属性配置数据库连接了,参阅 连接至数据库。这种方式能简化整体的配置,因为 app.properties 文件定义了包括数据源参数在内的所有配置信息。还有,这能使您的 WAR 文件与应用程序服务环境完全独立。

    依然支持从 JNDI 获取数据源,所以对现有项目来说,这里不需要迁移。

  4. 可以使用 Spring profiles 自定义应用程序在不同环境的行为。

  5. 操作系统环境变量可以作为 应用程序属性 值的来源。

  6. 在不重启应用程序服务的情况下对 Web 应用程序进行重部署变得更加可靠了,由于使用了 Classloader Leak Prevention 库。

通用用户界面

  1. SideMenu 现在可以进行收放了,这样能节省水平方向的空间。另外,菜单的品牌图片和其他组件也重新排布了。参阅 破坏性改动 部分了解项目迁移可能出现的问题。

  2. 登录的 "remember me - 记住我" 机制完全重新实现了:

    • 使用新的应用程序属性 cuba.rememberMeExpirationTimeoutSec 定义 “记住我” cookie 以及 RememberMeToken 实体实例的超时时限。默认设置为 30 天。

    • 如果用户在登录界面选择了 Remember Me - 记住我 复选框,下次打开应用程序时不会显示登录界面而直接登录。

    • 如果用户主动退出系统,或者 cookie 过期了,下次打开应用程序则会显示登录界面。

  3. 界面中加载数据用的 视图 可以在界面描述中直接定义了,参考 这个 例子。使用该功能将不必在 views.xml 文件中定义共享视图了。

  4. 标准操作 现在提供可以在 XML 和 Java 中配置的参数。因此,如果只是需要以对话框的模式打开编辑界面或者指定不同的界面类,不需要重新编写整个操作了。使用 Studio 中的 Component Inspector 查找并分配操作属性和处理器,也可以从文档复制代码片段。

  5. ViewAction - 查看操作 可以在编辑界面以只读模式打开实体。可以使用可选参数 enableEditing 切换至编辑模式而不需要重新打开界面。

  6. 引入了 StandardOutcomeDialogOutcome 枚举, 可以用来在关闭界面时替换 CloseAction 常量,并检查界面或者对话框是如何关闭的。

  7. Form - 表单 现在支持控件位置的灵活摆放了,参考 colspanrowspan XML 属性以及 add() 方法中对应的参数。

  8. 除了通用过滤器的全局布局模板之外,也可以为每个单独的过滤器实例设置布局,参阅 controlsLayoutTemplate 属性。

  9. BulkEditor - 批量编辑器 添加了响应式布局,可以使用 columnsMode 属性控制。

  10. DateField - 日期控件,如果设置新的 autofill 属性为 true,会在输入了日期之后自动填充当前的月和年。

  11. TimeField - 时间控件 能使用 12h AM/PM 格式,需要设置 timeMode 属性为 H_12

  12. Table - 表格DataGrid - 数据网格 中,可以通过使用 column 元素的 sort 属性声明式的设置初始化的排序规则。

  13. DataGrid - 数据网格TreeDataGrid - 树形数据网格,可以使用下列预定义的样式:borderlessno-horizontal-linesno-vertical-linesno-stripes

  14. PopupView - 弹窗控件 支持使用 popupPositionpopupToppopupLeft 属性设置其弹出位置。

  15. 所有的表格和数据网格现在都支持 Select all - 全选 / Deselect all - 取消全选 命令,该命令可以通过列弹窗操作,能简化对列的超长列表管理。

  16. LookupField - 下拉框控件LookupPickerField - 下拉选择器 添加了 setOptionImageProvider 方法。现在可以为控件的选项显示图片了(之前只能使用图标)。在 Studio 的组件检查器中,切换至 Handlers 标签页然后双击 optionImageProvider 即可生成处理器代码。

  17. Button - 按钮控件 已经自带 shortcut 属性了,即使该按钮不关联操作,也可以为其分配快捷键。

  18. 添加了新的 Slider - 滑动条 组件。

  19. 如果设置 RowsCountautoLoad 属性为 true,该组件会在后台加载行数并自动显示。

  20. Filter - 过滤器 组件现在能使用 KeyValueCollectionContainer 加载器了。

其它改动

  1. 已经完全 支持 Kotlin,意味着可以在项目的所有地方都使用该语言:实体、bean、界面控制器等等。对 Kotlin 编写的界面控制器热部署也已经支持。

  2. 现在可以在 core 模块的 /db/init_<datastore_name>/db/update_<datastore_name> 目录为附加数据存储提供数据库迁移脚本了。脚本可以在 createDbupdateDb Gradle 任务中执行,但是任务需要带有 storeName 参数。另外,应用程序服务也可以执行这些脚本,如果配置了 cuba.automaticDatabaseUpdate 属性。

  3. 新项目和迁移项目使用 Gradle 5.6.4 。Studio 会在 gradle/wrapper/gradle-wrapper.properties 文件配置合适的版本,如果遇到了项目构建问题,可以检查这里。

  4. 新项目使用 JUnit 5 做测试。 文档 也已更新。

  5. ViewBuilder 简化了在业务逻辑和测试中创建视图。

  6. DataManager 的流式操作接口可以指定简化格式的 JPQL 语句,允许省略部分语句,这些省略的部分能从上下文推断出来。

  7. 只读的 transient 属性 监听器会在关联的属性改动时发出消息。当展示只读属性时,如果这些属性依赖其他可变属性,那么这个机制有助于检测发生变化时更新 UI 展示。

  8. @PostConstruct 方法可以接收 global 模块定义的 Spring beans 作为参数。

依赖更新

核心框架:

com.fasterxml.jackson = 2.10.1 com.fasterxml.jackson-databind = 2.10.1 com.google.code.gson/gson = 2.8.6 com.google.guava/guava = 28.1-jre com.microsoft.sqlserver/mssql-jdbc = 7.2.2.jre8 com.sun.mail/javax.mail = 1.6.2 com.vaadin = 8.9.2-0-cuba commons-codec/commons-codec = 1.13 de.javakaffee/kryo-serializers = 0.45 mysql/mysql-connector-java = 8.0.17 org.apache.commons/commons-collections4 = 4.4 org.apache.commons/commons-compress = 1.19 org.apache.commons/commons-dbcp2 = 2.7.0 org.apache.commons/commons-pool2 = 2.7.0 org.apache.commons/commons-text = 1.8 org.apache.httpcomponents/httpclient = 4.5.10 org.apache.poi/poi = 4.1.1 org.aspectj/aspectjrt = 1.9.4 org.aspectj/aspectjweaver = 1.9.4 org.codehaus.groovy = 2.5.8 org.freemarker/freemarker = 2.3.29 org.hibernate.validator/hibernate-validator = 6.1.1.Fin`al org.hsqldb/hsqldb = 2.5.0 org.jgroups/jgroups = 4.1.8.Final org.jmockit/jmockit = 1.48 org.jsoup/jsoup = 1.12.1 org.postgresql/postgresql = 42.2.8 org.slf4j/log4j-over-slf4j = 1.7.29 org.slf4j/slf4j-api = 1.7.29 org.springframework = 5.2.1.RELEASE org.springframework.security = 5.2.1.RELEASE tomcat = 9.0.27

FTS 插件:

org.apache.lucene = 8.2.0 org.apache.tika/tika-parsers = 1.22

Reports 插件:

com.haulmont.yarg = 2.2.4 org.apache.poi/ooxml-schemas = 1.4 org.apache.xmlbeans/xmlbeans = 3.1.0

 
      
. . .