在开发中遇到xdoclet去运行hibernate中的注释时,发现xdoclet是识别不了hibernate的filter-def和filter,filter-param等,找找xdoclet的源码不难发现,其实xdoclet去解析java文件的注释时,都是通过一个扩展名为xdt的模板文件来生成的,它里面用的是自定义的标签语言,本人觉的不太难理解,就上面的例子而言,要想让xdoclet的hibernate模块能识别过滤器的标签,增加过滤器的识别模版语言,先从MyEclipse中找到xdoclet的hibernate模块jar包,再从jar包中获得模板文件 :
<?xml version="1.0" encoding="<XDtConfig:configParameterValue paramName='Xmlencoding'/>"?>
<!DOCTYPE hibernate-mapping PUBLIC
"<XDtXml:publicId/>"
"<XDtXml:systemId/>">
<hibernate-mapping
<XDtClass:ifHasClassTag tagName="hibernate.mapping" paramName="schema" superclasses="false">
schema="<XDtClass:classTagValue tagName="hibernate.mapping" paramName="schema" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.mapping" paramName="default-cascade" superclasses="false">
default-cascade="<XDtClass:classTagValue tagName="hibernate.mapping" paramName="default-cascade" values="none,save-update"/>"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.mapping" paramName="auto-import" superclasses="false">
auto-import="<XDtClass:classTagValue tagName="hibernate.mapping" paramName="auto-import" values="true,false" />"
</XDtClass:ifHasClassTag>
>
<XDtHibernate:logMapping/>
<class
<XDtClass:ifHasClassTag tagName="hibernate.class" superclasses="false">
name="<XDtClass:fullTransformedClassName />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="table" superclasses="false">
table="<XDtClass:classTagValue tagName="hibernate.class" paramName="table" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="schema" superclasses="false">
schema="<XDtClass:classTagValue tagName="hibernate.class" paramName="schema" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="lazy" superclasses="true">
lazy="<XDtClass:classTagValue tagName="hibernate.class" paramName="lazy" values="true,false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="proxy" superclasses="false">
proxy="<XDtClass:classTagValue tagName="hibernate.class" paramName="proxy" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="polymorphism" superclasses="false">
polymorphism="<XDtClass:classTagValue tagName="hibernate.class" paramName="polymorphism" values="explicit,implicit" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="dynamic-update" superclasses="false">
dynamic-update="<XDtClass:classTagValue tagName="hibernate.class" paramName="dynamic-update" values="true,false" default="false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="dynamic-insert" superclasses="false">
dynamic-insert="<XDtClass:classTagValue tagName="hibernate.class" paramName="dynamic-insert" values="true,false" default="false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="select-before-update" superclasses="false">
select-before-update="<XDtClass:classTagValue tagName="hibernate.class" paramName="select-before-update" values="true,false" default="false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="optimistic-lock" superclasses="false">
optimistic-lock="<XDtClass:classTagValue tagName="hibernate.class" paramName="optimistic-lock" values="version,none,all,dirty" default="version"/>"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="mutable" superclasses="false">
mutable="<XDtClass:classTagValue tagName="hibernate.class" paramName="mutable" values="true,false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="discriminator-value" superclasses="false">
discriminator-value="<XDtClass:classTagValue tagName="hibernate.class" paramName="discriminator-value" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="where" superclasses="false">
where="<XDtClass:classTagValue tagName="hibernate.class" paramName="where" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="persister" superclasses="false">
persister="<XDtClass:classTagValue tagName="hibernate.class" paramName="persister" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.class" paramName="batch-size" superclasses="false">
batch-size="<XDtClass:classTagValue tagName="hibernate.class" paramName="batch-size" />"
</XDtClass:ifHasClassTag>
>
<XDtClass:ifHasClassTag tagName="hibernate.cache" superclasses="false">
<cache usage="<XDtClass:classTagValue tagName="hibernate.cache" paramName="usage" values="read-write,nonstrict-read-write,read-only,transactional" />" />
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.jcs-cache" superclasses="false">
<jcs-cache usage="<XDtClass:classTagValue tagName="hibernate.jcs-cache" paramName="usage" values="read-only,nonstrict-read-write,read-write,transactional" />" />
</XDtClass:ifHasClassTag>
<XDtHibernate:ifHasPrimitiveId>
<id
name="<XDtMethod:propertyName/>"
<XDtMethod:ifDoesntHaveMethodTag tagName="hibernate.column">
column="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="column" default="<XDtMethod:propertyName/>" />"
</XDtMethod:ifDoesntHaveMethodTag>
type="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="type" default="<XDtMethod:methodType/>" />"
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="length">
length="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="length" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="access">
access="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="access"/>"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="unsaved-value">
unsaved-value="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="unsaved-value" />"
</XDtMethod:ifHasMethodTag>
>
<XDtMethod:forAllMethodTags tagName="hibernate.column">
<column
name="<XDtHibernate:computeColumnName base='<XDtMethod:methodTagValue tagName="hibernate.column" paramName="name"/>'/>"
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="length">
length="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="length" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="unique-key">
unique-key="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="unique-key" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="index">
index="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="index" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="not-null">
not-null="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="not-null" default="false" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="unique">
unique="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="unique" default="false" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.column" paramName="sql-type">
sql-type="<XDtMethod:methodTagValue tagName="hibernate.column" paramName="sql-type" />"
</XDtMethod:ifHasMethodTag>
/>
</XDtMethod:forAllMethodTags>
<generator class="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="generator-class" />">
<XDtMethod:forAllMethodTags tagName="hibernate.generator-param" >
<param<XDtConfig:ifConfigParamGreaterOrEquals paramName="version" value="2.0"> name="<XDtMethod:methodTagValue tagName="hibernate.generator-param" paramName="name" />"</XDtConfig:ifConfigParamGreaterOrEquals>><XDtMethod:methodTagValue tagName="hibernate.generator-param" paramName="value" /></param>
</XDtMethod:forAllMethodTags>
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="generator-parameter-1">
<param><XDtMethod:methodTagValue tagName="hibernate.id" paramName="generator-parameter-1" /></param>
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="generator-parameter-2">
<param><XDtMethod:methodTagValue tagName="hibernate.id" paramName="generator-parameter-2" /></param>
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="generator-parameter-3">
<param><XDtMethod:methodTagValue tagName="hibernate.id" paramName="generator-parameter-3" /></param>
</XDtMethod:ifHasMethodTag>
<XDtMerge:merge file="hibernate-generator-params-{0}.xml">
<!--
To add non XDoclet generator parameters, create a file named
hibernate-generator-params-<XDtClass:className />.xml
containing the additional parameters and place it in your merge dir.
-->
</XDtMerge:merge>
</generator>
</id>
</XDtHibernate:ifHasPrimitiveId>
<XDtHibernate:ifHasCompositeId>
<composite-id
name="<XDtMethod:propertyName/>"
class="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="class" default="<XDtMethod:methodType/>"/>"
<XDtMethod:ifHasMethodTag tagName="hibernate.id" paramName="unsaved-value">
unsaved-value="<XDtMethod:methodTagValue tagName="hibernate.id" paramName="unsaved-value" values="any,none"/>"
</XDtMethod:ifHasMethodTag>
>
<XDtClass:pushClass value="<XDtMethod:methodType/>">
<XDtMethod:forAllMethods superclasses="true" sort="true">
<XDtMethod:ifHasMethodTag tagName="hibernate.property">
<key-property
name="<XDtMethod:propertyName />"
type="<XDtMethod:methodTagValue tagName="hibernate.property" paramName="type" default="<XDtMethod:methodType/>"/>"
column="<XDtMethod:methodTagValue tagName="hibernate.property" paramName="column" default="<XDtMethod:propertyName/>"/>"
<XDtMethod:ifHasMethodTag tagName="hibernate.property" paramName="length">
length="<XDtMethod:methodTagValue tagName="hibernate.property" paramName="length" />"
</XDtMethod:ifHasMethodTag>
/>
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.many-to-one">
<key-many-to-one
name="<XDtMethod:propertyName/>"
class="<XDtMethod:methodTagValue tagName="hibernate.many-to-one" paramName="class" default="<XDtMethod:methodType/>" />"
column="<XDtMethod:methodTagValue tagName="hibernate.many-to-one" paramName="column" default="<XDtMethod:propertyName/>"/>"
/>
</XDtMethod:ifHasMethodTag>
</XDtMethod:forAllMethods>
</XDtClass:pushClass>
</composite-id>
</XDtHibernate:ifHasCompositeId>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" superclasses="false">
<discriminator
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="column" superclasses="false">
column="<XDtClass:classTagValue tagName="hibernate.discriminator" paramName="column" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="not-null" superclasses="false">
not-null="<XDtClass:classTagValue tagName="hibernate.discriminator" values="true,false" paramName="not-null" default="true" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="type" superclasses="false">
type="<XDtClass:classTagValue tagName="hibernate.discriminator" paramName="type" default="string"/>"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="length" superclasses="false">
length="<XDtClass:classTagValue tagName="hibernate.discriminator" paramName="length" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="force" superclasses="false">
force="<XDtClass:classTagValue tagName="hibernate.discriminator" values="true,false" paramName="force" default="false" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.discriminator" paramName="insert" superclasses="false">
insert="<XDtClass:classTagValue tagName="hibernate.discriminator" values="true,false" paramName="insert" default="true" />"
</XDtClass:ifHasClassTag>
/>
</XDtClass:ifHasClassTag>
<XDtMethod:forAllMethods superclasses="true" sort="true">
<XDtMethod:ifHasMethodTag tagName="hibernate.version">
<version
name="<XDtMethod:propertyName />"
column="<XDtMethod:methodTagValue tagName="hibernate.version" paramName="column" default="<XDtMethod:propertyName/>" />"
type="<XDtMethod:methodTagValue tagName="hibernate.version" paramName="type" default="<XDtMethod:methodType/>" />"
<XDtMethod:ifHasMethodTag tagName="hibernate.version" paramName="access">
access="<XDtMethod:methodTagValue tagName="hibernate.version" paramName="access" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.version" paramName="unsaved-value">
unsaved-value="<XDtMethod:methodTagValue tagName="hibernate.version" paramName="unsaved-value" />"
</XDtMethod:ifHasMethodTag>
/>
</XDtMethod:ifHasMethodTag>
</XDtMethod:forAllMethods>
<XDtMethod:forAllMethods superclasses="true" sort="true">
<XDtMethod:ifHasMethodTag tagName="hibernate.timestamp">
<timestamp
name="<XDtMethod:propertyName/>"
column="<XDtMethod:methodTagValue tagName="hibernate.timestamp" paramName="column" default="<XDtMethod:propertyName/>" />"
<XDtMethod:ifHasMethodTag tagName="hibernate.timestamp" paramName="access">
access="<XDtMethod:methodTagValue tagName="hibernate.timestamp" paramName="access" />"
</XDtMethod:ifHasMethodTag>
<XDtMethod:ifHasMethodTag tagName="hibernate.timestamp" paramName="unsaved-value">
unsaved-value="<XDtMethod:methodTagValue tagName="hibernate.timestamp" paramName="unsaved-value" />"
</XDtMethod:ifHasMethodTag>
/>
</XDtMethod:ifHasMethodTag>
</XDtMethod:forAllMethods>
<XDtCollection:create name="backupClass" type="map" />
<XDtCollection:put name="backupClass" key="oldClassName" value="<XDtClass:fullClassName />" />
<XDtMethod:forAllMethods superclasses="true" sort="true">
<XDtMerge:merge file="xdoclet/modules/hibernate/resources/hibernate-properties.xdt">
</XDtMerge:merge>
</XDtMethod:forAllMethods>
<XDtMerge:merge file="hibernate-properties.xml">
</XDtMerge:merge>
<XDtMerge:merge file="hibernate-properties-{0}.xml">
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-<XDtClass:className />.xml
containing the additional properties and place it in your merge dir.
-->
</XDtMerge:merge>
<XDtMerge:merge file="xdoclet/modules/hibernate/resources/hibernate-subclass.xdt">
</XDtMerge:merge>
<XDtMerge:merge file="xdoclet/modules/hibernate/resources/hibernate-joined-subclass.xdt">
</XDtMerge:merge>
<XDtClass:forAllClassTags tagName="hibernate.filter" >
<!-- 插入过滤器<XDtClass:classTagValue tagName="hibernate.filter" paramName="name" /> -->
<filter
<XDtClass:ifHasClassTag tagName="hibernate.filter" paramName="name" superclasses="false">
name="<XDtClass:classTagValue tagName="hibernate.filter" paramName="name" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.filter" paramName="condition" superclasses="false">
condition="<XDtClass:classTagValue tagName="hibernate.filter" paramName="condition" />"
</XDtClass:ifHasClassTag>
/>
</XDtClass:forAllClassTags>
</class>
<XDtClass:pushClass value="<XDtCollection:get name='backupClass' key='oldClassName' />">
<XDtClass:forAllClassTags tagName="hibernate.query" superclasses="false">
<XDtMerge:merge file="xdoclet/modules/hibernate/resources/hibernate-query.xdt">
</XDtMerge:merge>
</XDtClass:forAllClassTags>
<XDtHibernate:forAllSubclasses>
<XDtClass:forAllClassTags tagName="hibernate.query" superclasses="false">
<XDtMerge:merge file="xdoclet/modules/hibernate/resources/hibernate-query.xdt">
</XDtMerge:merge>
</XDtClass:forAllClassTags>
</XDtHibernate:forAllSubclasses>
</XDtClass:pushClass>
<XDtClass:ifHasClassTag tagName="hibernate.filter-def" superclasses="false">
<!-- 定义过滤器 <XDtClass:classTagValue tagName="hibernate.filter-def" paramName="name" />-->
<filter-def
<XDtClass:ifHasClassTag tagName="hibernate.filter-def" paramName="name" superclasses="false">
name="<XDtClass:classTagValue tagName="hibernate.filter-def" paramName="name" />"
</XDtClass:ifHasClassTag>
>
<!-- 参数 -->
<XDtClass:forAllClassTags tagName="hibernate.filter-param" superclasses="false" >
<filter-param
<XDtClass:ifHasClassTag tagName="hibernate.filter-param" paramName="name" superclasses="false">
name="<XDtClass:classTagValue tagName="hibernate.filter-param" paramName="name" />"
</XDtClass:ifHasClassTag>
<XDtClass:ifHasClassTag tagName="hibernate.filter-param" paramName="type" superclasses="false">
type="<XDtClass:classTagValue tagName="hibernate.filter-param" paramName="type" />"
</XDtClass:ifHasClassTag>
/>
</XDtClass:forAllClassTags>
</filter-def>
</XDtClass:ifHasClassTag>
<XDtCollection:destroy name="backupClass" />
</hibernate-mapping>
红色为自定义添加的内容,重新打成jar,替换成原来MyEclipse插件的hibernate模块的jar包,到此可以识别自定义的标签了