最近更新

本章节包含 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。参阅 以下内容

请参考破坏性改动的 完整列表,并在升级后做相应修复。

依赖更新

下列主要依赖库更新:

  • Spring Boot 3.5

  • Vaadin 24.7

新功能和改进

Studio 改进

Jmix AI 助手

Jmix AI 助手现在可以通过 Studio 工具窗口访问。 默认出现在 IDE 右侧的工具栏中,点击 jmix ai big 图标可以打开。

Studio 中 Jmix AI 助手与 web 版共享聊天会话记录列表,可以无缝切换。

新的代码片段

增加了超过 20 个新的关于 UI 的代码片段,主要分这几类:通知和弹窗,打开视图和 fragment,异步执行,以及 API 示例。

视图的移动

现在可以通过 Jmix 工具窗口右键菜单的 Move View 功能轻松移动视图至别的包内。Studio 会帮助移动 Java 控制器、视图 XML 并在消息包中更新相关的消息键值。

另外,如果在项目工具窗口使用 IDE 的通用功能移动 Java 控制器或视图 XML,Studio 还能提醒自动同时移动对应的 XML 或 Java 控制器并更新消息键值。

创建渲染器

当使用 Studio 为 UI 组件生成 渲染器 时,例如,为 dataGrid 生成列渲染器,Studio 会提供一个创建向导,可以创建 ComponentRendererTextRenderer 或一个空的处理方法。

用本地化消息替换字符串常量

新的便捷操作 Replace with localized message 支持将字符串文字快速替换为消息包中的本地化消息。适用于 Java 和 XML 代码。

将光标放在字符串文字上并按 Alt+Enter 即可访问此操作。

Lombok 支持

Studio 现在可以识别实体中的 @Getter@Setter 注解以及 Spring bean 中的 @RequiredArgConstructor 注解。如果存在这些注解,Studio 在添加实体属性或 bean 依赖时,不会生成显式的代码了。

还有,如果实体带了 @EqualsAndHashCode@Data 注解,Studio 还会显示警告(参阅 实体)。

大项目的性能

Studio 处理大项目的性能得到了显著的提升。即使项目中具有超过 1000 个实体,Jmix 工具窗口的项目树和资源角色设计器现在也非常快。

开关组件

增加了新的 switch 开关 组件,支持用户在两种状态之间切换(例如,on/off 或 true/false)。UI 上模仿带有滑动手柄的物理拨动开关。

多标签页应用程序模式的改进

多标签应用程序模式 组件已经改进完成,可用于生产环境。

  • 主视图的布局中显式声明了 mainTabSheet 组件。该组件能包含通过标签页右键菜单或快捷键调用的操作。

  • 支持标签页的拖拽。

  • @TabbedModeViewProperties 注解可以定义视图在标签页打开的参数。

  • 网页刷新时能保留 UI 的状态。

  • 网页刷新是能触发 UIRefreshEvent 事件。

多标签模式扩展组件的最终版需要使用企业版授权安装。

CodeEditor 中的自动完成

codeEditor 组件可以为特定的语言提供自动完成功能,也可以使用自定义的自动完成建议提供方法。

参阅 codeEditor:自动完成 了解更多。

HorizontalLayout 插槽

现在 hbox 布局组件支持在不同的对齐插槽(startcenterend)内放置组件了。为在 hbox 中对组件分组提供了更多的灵活性,提高了对组件位置的控制。

参阅 hbox:水平对齐 了解更多。

新增了两个回调方法,可以自定义对话框窗口的 header 和 footer:

  • configureDialogWindowHeader():在视图中重写该方法修改对话框的 header。

  • configureDialogWindowFooter():在视图中重写该方法修改对话框的 footer。

参阅 视图:所有方法 了解更多。

DataManager.saveWithoutReload 方法

当不需要立即使用保存后的实体时,新的 DataManager.saveWithoutReload() 可以提供更好的性能。这个方法可以替代之前复杂的 save(new SaveContext().saving(entities).setDiscardSaved(true)) 调用。

参阅 使用 DataManager:保存实体 了解更多。

消息模板导入导出

消息模板 扩展组件中,通过 ExportImport 操作可以在不同的应用程序直接交换模板。

日历中刷新数据

日历 扩展组件中,使用 FullCalendar 组件的新 refetchDataProvider() 方法刷新回调数据 provider。

认证服务的登出

授权服务 扩展组件在导航至 /logout URL 时,会执行标准的登出操作(使 HTTP 会话失效、清除安全上下文、删除会话 cookie)。

REST 数据存储改进

@RemoteService 接口

REST 数据存储扩展组件现在提供了一种调用远程开放的服务 REST API 的简单方法。在客户端,只需要创建一个镜像服务方法的接口,并用 @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 测试 了解更多。

破坏性改动

Node.js v.20

Vaadin 24.7 要求 Node.js 20+。如果使用的是本地安装的 Node,请按需升级。

删除了 editorActionsColumn 按钮的默认值

在之前的版本中,editorActionsColumn 内的按钮的某些属性具有默认值。具体来说,所有的按钮都分配了 icon,而 editButtoncancelButton 按钮有 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 中,移除了 inAppNotificationsDataGridcreate 操作。这个操作移到了视图的 actions 中,并改名为 createNotificationAction

如果项目中覆盖了这些视图,请按新的视图调整代码。

SecurityFilterChain 验证

Spring Security 6.5.0 引入了对多个 SecurityFilterChain 使用同一个 securityMatcher 的检测。

如果项目中同时包含了 OIDCAuthorization Server 这两个扩展组件,那么会创建这样的 chain。 这里的两个 chain 都是配置资源服务中 REST API 的安全保护。

在之前的版本中,Authorization Server 中的 chain 会有更高的优先级,从而会忽略 OIDC 中的 chain。

现在,如果仍然需要这两个扩展组件,那么应该手动禁用 OIDC 中的 chain 以恢复之前的行为。 禁用可以通过设置 jmix.oidc.use-default-jwt-configuration=false 实现。

变更日志