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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM