所有文章
目录

    CUBA 7.2 - 新功能介绍

    CUBA 的版本 7 是平台的一个式改进。内部架构的提升以及新的 IDE 为将来的更多改进提供了强大的基础。我们也在持续增加新功能,这样我们开发者的工作效率也能更高,生活也更美滋滋。

    在新的 7.2 版本中,我们增加了很多看上去像重大改进的提升,但是由于版本 7 的灵活性,这些改动其实只是正常的平台演进。

    语言大师 CUBA

    Kotlin 在基于 CUBA 的项目中已经作为一等语言提供全面的支持了。现在可以使用 Kotlin 创建实体、服务、界面控制器以及所有其他组件。

    使用 Kotlin 编码可以写出更短、更简洁的语句,相比以前使用 Java,创建应用程序的速度又可以更快了。基于 IntelliJ IDEA 在 IDE 中对语言的支持,我们可以实现与 Java 相同的功能:上下文驱动的依赖注入、智能提示、代码生成等等。

    下面是一个简单实体的例子。可以看到,代码相对于 Java,简洁了很多,没有 getter 跟 setter 了,代码的可读性非常强。

    @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 的人来说也依旧是相当熟悉:

    @UiController("petclinic_Vet.edit")
    @UiDescriptor("vet-edit.xml")
    @EditedEntityContainer("vetDc")
    @LoadDataBeforeShowclass VetEdit : StandardEditor<Vet>() {
        @Inject
        private lateinit var vetService: VetService@Subscribe("assignVisit")
        private fun onAssignVisitClick(event: Button.ClickEvent) {
            vetService.scheduleVisit(editedEntity, LocalDateTime.now());
        }
    }
    

    服务:

    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 代码中定义访问规则,因此,不再需要从测试环境导出角色定义然后导入生产环境了。不过,我们并没有摒弃传统的运行时角色定义,只是为安全子系统添加了一个新的功能。您可以决定是使用运行时定义角色还是设计时定义,或者二者皆用。

    这里是为实体、属性和界面定义访问规则的例子:

    @Role(name = "Customers Full Access")
    public class CustomersFullAccessRole extends AnnotatedRoleDefinition {
    
        @EntityAccess(target = Customer.class,
                allow = {EntityOp.CREATE, EntityOp.READ, EntityOp.UPDATE, EntityOp.DELETE})
        @Overridepublic EntityPermissionsContainer entityPermissions() {
            return super.entityPermissions();
        }
    
        @EntityAttributeAccess(target = Customer.class, modify = {"name", "email"})
        @Overridepublic EntityAttributePermissionsContainer entityAttributePermissions() {
            return super.entityAttributePermissions();
        }
    
        @ScreenAccess(allow = {"application-demo", "demo_Customer.browse", "demo_Customer.edit"})
        @Overridepublic ScreenPermissionsContainer screenPermissions() {
            return super.screenPermissions();
        }
    }
    

    对比“传统”的运行时定义的角色,这种方式看上去确实冗长一些,但是这个方法可以让我们配置更加细致的多种应用程序组件访问权限。加上新引入“权限范围”,升级后的安全子系统将能使您的应用程序更安全。

    更好的通用用户界面

    我们一直在支持和改进通用 UI 子系统。在这个新版中,我们将默认的侧边菜单做成了可伸缩的,以便节省更多的应用程序界面空间。只要启动新的应用程序,便能看见。

    界面内部逻辑方面,现在开发者可以在 XML 界面描述中定义视图,而无需在单独的文件中定义视图了。

    <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 文件中配置连接属性。

    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
    

    这个功能使得应用程序不依赖应用程序部署的服务器环境。并且通过与 Spring profile 结合,会支持更强大的配置。不错,Spring profile 是 7.2 的又一个新功能。

    使用 Spring profile 可以定义特定部署环境中使用的 bean。比如,针对开发环境和生产环境,可以有不同的实现。

    public interface HelloService {
        String NAME = "demo_helloService";
    
        String hello(String input);
    }
    
    @Service(HelloService.NAME)
    @Profile("dev")
    public class HelloDevServiceBean implements HelloService {
        @Overridepublic String hello(String input) {
            return "Development stub: hello " + input;
        }
    }
    
    @Service(HelloService.NAME)
    @Profile("prod")
    public class HelloProdServiceBean implements HelloService {
        @Overridepublic String hello(String input) {
            return "Production service: hello " + input;
        }
    }
    

    一个 profile 可以通过 web.xml 文件定义或者通过设置命令行参数 spring.profiles.active 定义:

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

    Spring profile 不止可以用在 bean 上,也可以用到配置文件上。比如,可以在 <profile>-app.properties 文件中定义针对该 profile 生效的配置。这样的话,可以给测试和生产环境配置不同的 SMTP 邮件服务器,再也不用给客户的邮箱发送测试邮件啦!

    CUBA Studio 升级

    CUBA Studio 支持上面提到的所有功能。我们的主要开发工具也是在不断的更新开发。我们添加新的功能,使用新的 IntelliJ API,并且不断改进代码自动生成的算法以便能自动化任何可以自动化的部分,这样您无需写重复的样板代码。

    所有的更新可以在这里找到,我们这里只看看最重要的一些改进:

    • 新的登录界面模板。现在可以使用更“品牌友好”的登录窗口了。
    • 重写了界面设计器 UI,我们将各个面板做了分离以节省 IDE 的窗口空间,并且开发者在修改 XML 的同时就能看到界面变化。
    • 扩展了项目创建向导,支持新的编程语言,支持输入更多的信息,比如地区,主数据存储属性等。

    结论

    这次更新之后,使用 CUBA 框架开发变得更加容易、快速,更加激动人心!使用 Kotlin,您将有机会使用一种最流行的开发语言。

    得益于使用了 Spring profile 和应用程序配置数据源,简化了部署至不同的环境的工作。

    通用用户界面的改进将帮助您以更高的准确度将设计师的理想用户界面带到现实世界。

    我们仍然保持该框架向后兼容,因此您能顺利的升级到 7.2 版。

    所有改动的列表参考发行说明

    了解如何在 12 分钟内完成一个简单可运行的应用程序