概览
该文档列出 CUBA 平台版本 7.2 的主要改动。
Warning
|
请注意,如要使用 CUBA 7.2,您需要先 安装 Studio 13 或更新的版本。之前的 Studio 版本不能正确处理新版本的项目创建、迁移以及热部署。 |
破坏性改动
-
由于登录的 "remember me - 记住我" 机制发生了变化(参考下面介绍),在升级后所有用户都需要在登录时重新输入凭证,现象与 cookie 被删除一样。
-
对
LoginScreen
类进行了重构,简化了创建 新登录窗口 的实现过程。内部类AuthInfo
移至LoginScreenAuthDelegate
,所以如果您已经扩展了登录界面并且重写这个同名方法,需要对 import 做一定修改,例如:public class ExtLoginScreen extends LoginScreen { @Override protected void setAuthInfo(LoginScreenAuthDelegate.AuthInfo authInfo) { // ...
-
由于 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"> <!-- -->
-
由于引入了 安全范围,删除了
cuba.anonymousSessionId
应用程序属性。现在所有范围的匿名会话都使用随机标识符创建。 -
UserSession
类有了如下改动:-
在构造器中,
Role
的集合替换成RoleDefinition
的集合。 -
删除了
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);
-
删除了这些方法:
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);
-
-
许多 UI 组件(比如
Label
的值和TextField
的标题)的 HTML 内容现在默认会做清理以防止跨站脚本(XSS)。如果发现显示自定义的 HTML 有问题,可以先关掉这个清理功能,使用 cuba.web.htmlSanitizerEnabled 应用程序属性,或者在单独的组件内使用其setHtmlSanitizerEnabled()
方法。 -
当使用 文件夹面板 时,Add to set - 添加至集合 操作和按钮不会在关联了通用过滤器的表格中自动显示。如果需要该操作,按照 记录集 章节的介绍显式添加。
-
JGroups 升级至 4.1.8.Final。如果您使用 中间件集群,需要对您的 JGroup 配置文件做如下改动:
-
对于 UDP 配置,替换:
-
MERGE2
→MERGE3
-
pbcast.NAKACK
→pbcast.NAKACK2
,并删除retransmit_timeout
属性。 -
UNICAST
→UNICAST3
-
FC
→MFC
-
-
对于 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"
。更多细节参阅 这篇文章。
-
-
DataContext.evictAll()
重命名为evictModified()
,这个名字更加匹配其功能,只是用来清除修改过和删除的实例。如果需要清除包括修改的实例在内的所有实例,可以使用新的clear()
方法。 -
Icons.Icon.name()
方法重命名为iconName()
。 -
对
Calendar
做了泛化,需要指定特定的数据类型以便使用对应的日期类型 API(之前是直接使用java.util.Date
)。
安全子系统
-
重新实现了安全子系统的 权限 和 角色,以便提供 "默认拒绝" 的模型替换之前的 "默认许可" 模型。使用 CUBA 7.2 新建的项目会默认直接使用新模型。如果从之前版本的 CUBA 迁移过来,Studio 会添加应用程序属性以保持现有的安全配置不变,参阅 遗留版本角色和许可。
-
现在安全 角色 和 访问组 以及权限和角色可以在设计时进行定义,通过使用带特定注解的 Java 类实现。这将使得访问控制更加健壮,并能避免在不同的应用程序实例之间同步配置(比如,从开发环境到生产环境)。注意,设计时角色只能在新的 CUBA 7.2 项目生效。如果从之前版本迁移过来,想使用设计时角色,则需要删除一些应用程序属性,并重新配置您的现有角色和许可,参阅 遗留版本角色和许可
-
引入了 安全范围 的概念,可以为通过不同客户端登录的用户配置不同的角色组。这个功能背后的动机是因为,REST API 客户端应当比通用 UI 的用户有更多的限制,因为通用 UI 本质上更安全。
部署
-
在开发和部署环境使用 应用程序主目录 已经标准化。当在 Studio 启动应用程序时,应用程序主目录创建在
deploy/app_home
目录。包含为所有应用程序 block 服务的conf
、temp
和work
文件夹,以及通用的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
。 -
可以很方便的为开发环境提供您自己的 日志配置 :只需要在项目内创建
etc/logback.xml
文件,当您启动项目时,该文件会被拷贝至deploy/app_home
,然后日志初始化程序会识别此文件。 -
现在可以用应用程序属性配置数据库连接了,参阅 连接至数据库。这种方式能简化整体的配置,因为
app.properties
文件定义了包括数据源参数在内的所有配置信息。还有,这能使您的 WAR 文件与应用程序服务环境完全独立。依然支持从 JNDI 获取数据源,所以对现有项目来说,这里不需要迁移。
-
可以使用 Spring profiles 自定义应用程序在不同环境的行为。
-
操作系统环境变量可以作为 应用程序属性 值的来源。
-
在不重启应用程序服务的情况下对 Web 应用程序进行重部署变得更加可靠了,由于使用了 Classloader Leak Prevention 库。
通用用户界面
-
SideMenu 现在可以进行收放了,这样能节省水平方向的空间。另外,菜单的品牌图片和其他组件也重新排布了。参阅 破坏性改动 部分了解项目迁移可能出现的问题。
-
登录的 "remember me - 记住我" 机制完全重新实现了:
-
使用新的应用程序属性 cuba.rememberMeExpirationTimeoutSec 定义 “记住我” cookie 以及
RememberMeToken
实体实例的超时时限。默认设置为 30 天。 -
如果用户在登录界面选择了 Remember Me - 记住我 复选框,下次打开应用程序时不会显示登录界面而直接登录。
-
如果用户主动退出系统,或者 cookie 过期了,下次打开应用程序则会显示登录界面。
-
-
界面中加载数据用的 视图 可以在界面描述中直接定义了,参考 这个 例子。使用该功能将不必在
views.xml
文件中定义共享视图了。 -
标准操作 现在提供可以在 XML 和 Java 中配置的参数。因此,如果只是需要以对话框的模式打开编辑界面或者指定不同的界面类,不需要重新编写整个操作了。使用 Studio 中的 Component Inspector 查找并分配操作属性和处理器,也可以从文档复制代码片段。
-
ViewAction - 查看操作 可以在编辑界面以只读模式打开实体。可以使用可选参数
enableEditing
切换至编辑模式而不需要重新打开界面。 -
引入了 StandardOutcome 和 DialogOutcome 枚举, 可以用来在关闭界面时替换
CloseAction
常量,并检查界面或者对话框是如何关闭的。 -
Form - 表单 现在支持控件位置的灵活摆放了,参考
colspan
和rowspan
XML 属性以及add()
方法中对应的参数。 -
除了通用过滤器的全局布局模板之外,也可以为每个单独的过滤器实例设置布局,参阅 controlsLayoutTemplate 属性。
-
BulkEditor - 批量编辑器 添加了响应式布局,可以使用
columnsMode
属性控制。 -
DateField - 日期控件,如果设置新的
autofill
属性为 true,会在输入了日期之后自动填充当前的月和年。 -
TimeField - 时间控件 能使用 12h AM/PM 格式,需要设置
timeMode
属性为H_12
。 -
在 Table - 表格 和 DataGrid - 数据网格 中,可以通过使用
column
元素的sort
属性声明式的设置初始化的排序规则。 -
对 DataGrid - 数据网格 和 TreeDataGrid - 树形数据网格,可以使用下列预定义的样式:
borderless
、no-horizontal-lines
、no-vertical-lines
、no-stripes
。 -
PopupView - 弹窗控件 支持使用
popupPosition
、popupTop
、popupLeft
属性设置其弹出位置。 -
所有的表格和数据网格现在都支持 Select all - 全选 / Deselect all - 取消全选 命令,该命令可以通过列弹窗操作,能简化对列的超长列表管理。
-
为
LookupField - 下拉框控件
和LookupPickerField - 下拉选择器
添加了 setOptionImageProvider 方法。现在可以为控件的选项显示图片了(之前只能使用图标)。在 Studio 的组件检查器中,切换至 Handlers 标签页然后双击 optionImageProvider 即可生成处理器代码。 -
Button - 按钮控件 已经自带
shortcut
属性了,即使该按钮不关联操作,也可以为其分配快捷键。 -
添加了新的 Slider - 滑动条 组件。
-
如果设置 RowsCount 的
autoLoad
属性为 true,该组件会在后台加载行数并自动显示。 -
Filter - 过滤器 组件现在能使用 KeyValueCollectionContainer 加载器了。
其它改动
-
已经完全 支持 Kotlin,意味着可以在项目的所有地方都使用该语言:实体、bean、界面控制器等等。对 Kotlin 编写的界面控制器热部署也已经支持。
-
现在可以在
core
模块的/db/init_<datastore_name>
和/db/update_<datastore_name>
目录为附加数据存储提供数据库迁移脚本了。脚本可以在 createDb 和 updateDb Gradle 任务中执行,但是任务需要带有storeName
参数。另外,应用程序服务也可以执行这些脚本,如果配置了 cuba.automaticDatabaseUpdate 属性。 -
新项目和迁移项目使用 Gradle 5.6.4 。Studio 会在
gradle/wrapper/gradle-wrapper.properties
文件配置合适的版本,如果遇到了项目构建问题,可以检查这里。 -
新项目使用 JUnit 5 做测试。 文档 也已更新。
-
ViewBuilder 简化了在业务逻辑和测试中创建视图。
-
DataManager 的流式操作接口可以指定简化格式的 JPQL 语句,允许省略部分语句,这些省略的部分能从上下文推断出来。
-
只读的 transient 属性 监听器会在关联的属性改动时发出消息。当展示只读属性时,如果这些属性依赖其他可变属性,那么这个机制有助于检测发生变化时更新 UI 展示。
-
@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