zoukankan      html  css  js  c++  java
  • XML Parser Error on line 39: 必须声明元素类型 "domainObjectRenamingRule"。

    XML Parser Error on line 39: 必须声明元素类型 "domainObjectRenamingRule"。
    XML Parser Error on line 41: 元素类型为 "table" 的内容必须匹配 "(property*,generatedKey?,columnRenamingRule?,(columnOverride|ignoreColumn|ignoreColumnsByRegex)*)"。
    XML Parser Error on line 44: 必须声明元素类型 "domainObjectRenamingRule"。
    XML Parser Error on line 46: 元素类型为 "table" 的内容必须匹配 "(property*,generatedKey?,columnRenamingRule?,(columnOverride|ignoreColumn|ignoreColumnsByRegex)*)"

    这是因为在使用的tk-mybatis时候,使用的pom依赖版本过低,导致的这个原因

    换成最新的版本就会不报错了:

    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.6</version>
    </dependency>

    domainObjectRenamingRule该功能项是在MBG 1.3.6中新增加的功能,用于定义实体的重命名规则,常见的用途是取消表前缀。类似于columnRenamingRule,前者是重命名生成的模型对象的名称,后者是重命名表字段的名称。

    如果在低于该版本的MBG中使用该功能,会出现如下错误XML Parser Error on line 59: 必须声明元素类型 "domainObjectRenamingRule"。

    首先我们说说“columnRenamingRule”

    该功能出现较早,字面上就是在表字段生成属性名称,对字段进行重命名,然后生成属性,searchString使用正则,replaceString为替换的字符串。

    比如以下,flower表中有一个字段是flower_name,我希望生成的实体中属性不是flowerName,而是flower_name -> name。此场景会发生在我们想省略表字段中一些通配的前缀,只保留真正有意义的那部分。

    <table tableName="flower">
        <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        <columnRenamingRule searchString="^flower_" replaceString="" />
    </table>

    按照上述配置,Flower将使用name属性对应表中字段flower_name。因为使用了通用Mapper这里生成了注解

    public class Flower {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
     
        @Column(name = "flower_name")
        private String name;
     
        private String color;
        setter/getter....
    }

    FlowerMapper.xml

    <resultMap id="BaseResultMap" type="com.xx.Flower">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="flower_name" jdbcType="VARCHAR" property="name" />
        <result column="color" jdbcType="VARCHAR" property="color" />
    </resultMap>

    然后是domainObjectRenamingRule

    该功能和columnRenamingRule的配置基本是一致的。在它的基础上,我便直接上手。数据库中有两张表分别是cyber_Link、cyber_movie。我希望生成的模型是Link和Movie,略去前缀Cyber,配置如下。

    <table tableName="cyber%">
        <generatedKey column="id" sqlStatement="MySql" identity="true" />
        <domainObjectRenamingRule searchString="^cyber_" replaceString="" />
    </table>

    很意外,生成的模型依旧是按默认的方式分别为CyberLink和CyberMovie。表象是好像配置没有生效一样。

    于是我找到了源码中org.mybatis.generator.api.FullyQualifiedTable的这一段进行了调试。

    if (domainObjectRenamingRule != null) {
        Pattern pattern = Pattern.compile(domainObjectRenamingRule.getSearchString());
        String replaceString = domainObjectRenamingRule.getReplaceString();
        replaceString = replaceString == null ? "" : replaceString; //$NON-NLS-1$
        Matcher matcher = pattern.matcher(finalDomainObjectName);
        finalDomainObjectName = matcher.replaceAll(replaceString);
    }

    发现了domainObjectRenamingRule和columnRenamingRule重命名时机的不同,domainObjectRenamingRule的重名发生在生成了默认实体名之后,如本例中,正常流程应该是cyber_movie -> CyberMovie -> Movie(我配置的正则是按照表前缀开头的,所以我没能到这一步)。而columnRenamingRule是发生在生成属性名之前。

    所以上面的配置调整为即可

    <table tableName="cyber%">
        <generatedKey column="id" sqlStatement="MySql" identity="true" />
        <domainObjectRenamingRule searchString="^Cyber" replaceString="" />
    </table>
  • 相关阅读:
    WinAPI: DrawFrameControl 绘制控件
    WinAPI: SetPixel 和 SetPixelV 设置设备环境中指定位置的颜色
    WinAPI: GetSystemInfo 获取系统信息
    WinAPI: GetDiskFreeSpace 获取磁盘组织与容量信息
    WinAPI: GetDiskFreeSpaceEx 获取磁盘容量信息
    分享:Afinal 0.3.5 发布,Android快速开发框架
    海量数据多路归并排序的c++实现(归并时利用了败者树)
    当TransferEncoding遇上ContentEncoding_虚拟现实_百度空间
    chunked 编码 解码 c算法 yaneng的专栏 博客频道 CSDN.NET
    败者树 多路平衡归并外部排序 Dreaming.O的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11722167.html
Copyright © 2011-2022 走看看