最近更新
本章节包含 Jmix 框架和 Studio 2.6 的新功能介绍,以及在升级框架版本时需要注意的一些破坏性改动。
如何升级
如需新建 Jmix 2.6 项目或者升级已有项目,需要使用 Studio 2.6 以上版本。因此,请先 升级 Jmix Studio 插件。 IntelliJ IDEA 的最低版本要求是 2024.3。 |
参阅 升级项目 部分的介绍了解如何使用 Studio 升级项目。自动升级迁移过程会对项目做如下修改:
-
升级 Jmix BOM 的版本,BOM 又定义了所有依赖的版本。
-
升级 Jmix Gradle 插件的版本。
-
如果项目视图中的
editorActionsColumn
按钮没有设置值,则为其添加默认值。参阅 以下内容。 -
项目视图中如果用到
settings.component
元素的id
,则改为使用componentId
。参阅 以下内容。 -
为 jmix.ui.view-file-extensions 应用程序属性添加
html,htm
。参阅 以下内容。
请参考破坏性改动的 完整列表,并在升级后做相应修复。
新功能和改进
Studio 改进
Jmix AI 助手
Jmix AI 助手现在可以通过 Studio 工具窗口访问。
默认出现在 IDE 右侧的工具栏中,点击 图标可以打开。
Studio 中 Jmix AI 助手与 web 版共享聊天会话记录列表,可以无缝切换。
视图的移动
现在可以通过 Jmix 工具窗口右键菜单的 Move View 功能轻松移动视图至别的包内。Studio 会帮助移动 Java 控制器、视图 XML 并在消息包中更新相关的消息键值。
另外,如果在项目工具窗口使用 IDE 的通用功能移动 Java 控制器或视图 XML,Studio 还能提醒自动同时移动对应的 XML 或 Java 控制器并更新消息键值。
创建渲染器
当使用 Studio 为 UI 组件生成 渲染器 时,例如,为 dataGrid
生成列渲染器,Studio 会提供一个创建向导,可以创建 ComponentRenderer
、TextRenderer
或一个空的处理方法。
用本地化消息替换字符串常量
新的便捷操作 Replace with localized message 支持将字符串文字快速替换为消息包中的本地化消息。适用于 Java 和 XML 代码。
将光标放在字符串文字上并按 Alt+Enter
即可访问此操作。
Lombok 支持
Studio 现在可以识别实体中的 @Getter
和 @Setter
注解以及 Spring bean 中的 @RequiredArgConstructor
注解。如果存在这些注解,Studio 在添加实体属性或 bean 依赖时,不会生成显式的代码了。
还有,如果实体带了 @EqualsAndHashCode
或 @Data
注解,Studio 还会显示警告(参阅 实体)。
开关组件
增加了新的 switch 开关 组件,支持用户在两种状态之间切换(例如,on/off 或 true/false)。UI 上模仿带有滑动手柄的物理拨动开关。
多标签页应用程序模式的改进
多标签应用程序模式 组件已经改进完成,可用于生产环境。
-
主视图的布局中显式声明了
mainTabSheet
组件。该组件能包含通过标签页右键菜单或快捷键调用的操作。 -
支持标签页的拖拽。
-
@TabbedModeViewProperties
注解可以定义视图在标签页打开的参数。 -
网页刷新时能保留 UI 的状态。
-
网页刷新是能触发
UIRefreshEvent
事件。
多标签模式扩展组件的最终版需要使用企业版授权安装。 |
HorizontalLayout 插槽
现在 hbox
布局组件支持在不同的对齐插槽(start
、center
、end
)内放置组件了。为在 hbox
中对组件分组提供了更多的灵活性,提高了对组件位置的控制。
参阅 hbox:水平对齐 了解更多。
自定义 DialogWindow 的 header 和 footer
新增了两个回调方法,可以自定义对话框窗口的 header 和 footer:
-
configureDialogWindowHeader()
:在视图中重写该方法修改对话框的 header。 -
configureDialogWindowFooter()
:在视图中重写该方法修改对话框的 footer。
参阅 视图:所有方法 了解更多。
DataManager.saveWithoutReload 方法
当不需要立即使用保存后的实体时,新的 DataManager.saveWithoutReload()
可以提供更好的性能。这个方法可以替代之前复杂的 save(new SaveContext().saving(entities).setDiscardSaved(true))
调用。
参阅 使用 DataManager:保存实体 了解更多。
消息模板导入导出
在 消息模板 扩展组件中,通过 Export 和 Import 操作可以在不同的应用程序直接交换模板。
日历中刷新数据
在 日历 扩展组件中,使用 FullCalendar
组件的新 refetchDataProvider()
方法刷新回调数据 provider。
认证服务的登出
授权服务 扩展组件在导航至 /logout
URL 时,会执行标准的登出操作(使 HTTP 会话失效、清除安全上下文、删除会话 cookie)。
REST 数据存储改进
@RemoteService 接口
REST 数据存储扩展组件现在提供了一种调用远程开放的服务 REST API 的简单方法。在客户端,只需要创建一个镜像服务方法的接口,并用 @RemoteService
注解即可。
参阅 REST 数据存储:@RemoteService 接口 了解更多。
OIDC 认证
REST 数据存储扩展组件现在包含了 restds_RestOidcAuthenticator
bean,支持在集成应用程序时使用外部认证供应商(例如 Keycloak)。
参阅 REST 数据存储:外部认证 了解更多。
关闭延迟加载
新增的 jmix.eclipselink.disable-lazy-loading 应用程序属性可以为整个应用程序关闭延迟加载。
注意,这个是试验性功能。在将来的发行版中才能最终确认或放弃。如果使用过程中遇到问题,请提交 GitHub issue。
数据工具的安全性
数据工具扩展组件现在包含了以下安全角色和策略:
新角色:
-
datatools-full-access
- 授予数据工具的所有权限。 -
datatools-minimal-access
- 授予数据工具的只读权限。
新策略:
-
datatools.importExportEntity
- 控制数据工具中导入、导出功能的访问。
参阅 数据工具:安全角色 了解更多。
Masquerade UI 测试库
Masquerade 基于 Selenium WebDriver 和 Selenide 等知名工具,是一个专为 Jmix 应用程序设计的端到端 UI 测试库。Masquerade 通过提供方便的包装器和简化对 Web 元素关键功能的访问,简化了 Jmix UI 所有元素的测试。
参阅 端到端 UI 测试 了解更多。
破坏性改动
删除了 editorActionsColumn 按钮的默认值
在之前的版本中,editorActionsColumn 内的按钮的某些属性具有默认值。具体来说,所有的按钮都分配了 icon
,而 editButton
和 cancelButton
按钮有 text
属性值。
这个行为其实是不一致的,而且在应用程序项目中无法删除图标或文本。
现在这些按钮没有默认值了。
Studio 自动迁移程序会扫描项目中的所有视图,为没有显式设置值的这些按钮添加之前版本的默认值。
参阅 GitHub issue #4493 了解更多。
Renamed settings.component id attribute
The id
attribute of component
element in the settings facet has been renamed to componentId
to not confuse with the commonly used id
attribute. For example:
Jmix 2.5:
<facets>
<settings>
<component id="genericFilter"/>
</settings>
</facets>
Jmix 2.6+:
<facets>
<settings>
<component componentId="genericFilter"/>
</settings>
</facets>
The Studio migration procedure scans all views in the project and automatically renames this attribute.
参阅 GitHub issue #4412 了解更多。
Downloading HTML Content
To prevent potential XSS attacks, Content-Disposition: inline
is no longer used by default when downloading HTML files. As a result, HTML files are downloaded instead of being displayed automatically in the browser.
To restore the previous behavior, add html
to the list of extensions in the jmix.ui.view-file-extensions property. The Studio migration procedure automatically adds this extension.
The Reports add-on now has its own list of extensions enabled for viewing in the browser. It is configured using the jmix.reports.view-file-extensions property. This property includes HTML files by default, as the HTML content generated by reports is considered safe.
参阅 GitHub issue #4364 了解更多。
Kotlin 项目中为数据容器赋值
在 Kotlin 项目中,直接通过代码设置数据容器的 item
时可能会导致编译失败。例如:
someDc.item = entity
为了避免这个问题,请将赋值改为 setter 的调用:
someDc.setItem(entity)
参阅 GitHub issue #4576 了解更多。
动态属性视图的改进
动态属性 管理页面视图做了大量的重新设计。如果项目中覆盖了这些视图,请按新的视图调整代码。
in-app-notification-list-view.xml 改动
在 通知 扩展组件的 in-app-notification-list-view.xml
中,移除了 inAppNotificationsDataGrid
的 create
操作。这个操作移到了视图的 actions
中,并改名为 createNotificationAction
。
如果项目中覆盖了这些视图,请按新的视图调整代码。
SecurityFilterChain 验证
Spring Security 6.5.0 引入了对多个 SecurityFilterChain
使用同一个 securityMatcher
的检测。
如果项目中同时包含了 OIDC
和 Authorization Server
这两个扩展组件,那么会创建这样的 chain。
这里的两个 chain 都是配置资源服务中 REST API 的安全保护。
在之前的版本中,Authorization Server
中的 chain 会有更高的优先级,从而会忽略 OIDC
中的 chain。
现在,如果仍然需要这两个扩展组件,那么应该手动禁用 OIDC
中的 chain 以恢复之前的行为。
禁用可以通过设置 jmix.oidc.use-default-jwt-configuration=false
实现。