4

我正在使用 Velocity 在我的项目中生成不同的工件,包括 Java Hibernate Entities。

这是我的模板示例:

#foreach( $column in $columns )
    #if ($column.columnID != "id")
        #if ($column.isColumnAnIdentifier)
@Id
        #end
        #if ($column.isColumnValueGenerated)
@GeneratedValue
        #end
        #if ($column.isColumnValueNotNull)
@NotNull
        #end
        #if ($column.columnAllowedValues)
@Enumerated(EnumType.STRING)        
        #end
        #if ($column.isColumnValueUnique)
@Column(unique=true)
        #elseif ($column.isColumnJoinedManyToOne)
@ManyToOne
@JoinColumn(name = "$column.columnJoinByID")
        #else
@Column
        #end
private #if ($column.columnAllowedValues) $column.columnID.toUpperCase() #else $column.columnType #end $column.columnID;
    #end
#end

问题是生成的代码如下所示:

@Column
            private  String  vendor;

                                                        @NotNull
                                    @Column(unique=true)
            private  String  name;


@Column
            private  Integer  min_quantity;


@Column
            private  String  description;


@Column
            private  Boolean  active;

我尝试了建议的解决方案,在每行后添加##,但没有帮助。有没有办法强制 Velocity 保持模板中定义的空格?

    VelocityEngine velocityEngine = new VelocityEngine();
    velocityEngine.setProperty(RESOURCE_LOADER_PROPERTY, RESOURCE_LOADER_VALUE);
    velocityEngine.setProperty(CLASSPATH_RESOURCE_LOADER_PROPERTY, ClasspathResourceLoader.class.getName());
    velocityEngine.init();
    Template velocityTemplate = velocityEngine.getTemplate(TEMPLATE_RESOURCES_ROOT_FOLDER + "/" + templateFileName);;
    StringWriter writer = new StringWriter();
    velocityTemplate.merge(velocityContext, writer);
    writeToFile(writer, destinationFilePath);
4

2 回答 2

3

##尾的还不够,还需要去掉 Velocity 的缩进。

为了保持缩进,另一种方法是使用 Velocity 注释缩进:

#foreach( $column in $columns )##
#**##if ($column.columnID != "id")##
#*    *##if ($column.isColumnAnIdentifier)##
@Id
#*    *##end
#*    *##if ($column.isColumnValueGenerated)##
...

但我承认它相当丑陋。

即将发布的 Velocity 2.0 版本添加了一个空间吞噬选项,默认情况下处于活动状态,完全符合您的要求。最新的候选版本可在此处获得。

于 2017-04-09T22:32:38.890 回答
0

我存储我的文件没有任何缩进,在我编辑时添加它并在之后删除它。您需要在 Linux 或 Cygwin 上运行它:

安全识别领先的 Velocity 指令:

gawk '
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
BEGIN {p=""}
/^ *#(end|else)\>/ {p = substr(p,5)}
/^ *#(if|end|set|foreach|else|#)\>/ {
    printf "%s%s\n", p, ltrim($0);
    if($0 ~ /^ *#(if|foreach|else)\>/) p = p "    "; next;}
1'

删除缩进:

sed 's/^  #/#/'

如果您将这些故事作为脚本(并使用 vi/vim),您可以使用:

:%!VelocityIndent

...否则只需通过脚本通过管道传输文件。

于 2018-04-26T09:35:52.123 回答