概述
此文章基于Springboot
1,导入freemarker
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2,编写一个properties,freemarker.properties
里面内容
Customer=KF\$\{.now?string\('yyyyMMdd'\)\}\$\{f.rndInt\(6\)\}
``
这里使用\转义,是因为${}占位符没有引用会导致项目启动不起来,但是这里有个问题,就是用\转义出来使用@value获取的值有个,这就很拉跨,可能是我自己很拉跨,找不到properties转义的规则。
.now?string('yyyyMMdd') 是freemarker的内置函数 f.rndInt(6)是自己写的一个freemarker函数指令
3,创建FreeMarkerConfig 配置文件,创建函数指令
@Configuration
public class FreeMarkerConfig {
/**
* BeansWrapper
*/
public static final BeansWrapper DEFAULT_BEANS_WRAPPER = new BeansWrapperBuilder(freemarker.template.Configuration.VERSION_2_3_30).build();
@Autowired
protected freemarker.template.Configuration configuration;
/**
* 添加自定义标签
*/
@PostConstruct
public void setSharedVariable() {
SimpleHash hash = new SimpleHash(DEFAULT_BEANS_WRAPPER);
hash.put("f", new FunCommons());
try {
configuration.setAllSharedVariables(hash);
} catch (TemplateModelException e) {
e.printStackTrace();
}
}
}
这里需要注意的是,在freemarker官网中明确指出,在高版本中,需要明确指明version
public class FunCommons {
/**
* 随机指定长度的数字
*
* @param len 长度
* @return
*/
public synchronized String rndInt(int len) {
String random = Tools.rndStr(len, Tools.NUMBERS);
return random;
}
}
随机数自己随便写,但是不要太随便哈,注意前面.now?string(‘yyyyMMdd’)使用的是年月日+6位随机也是极容易碰撞的。
4,写一个解析字符串(必须是符合freemarker语法的)的类
@Component
public class FreeMarkerProvider {
@Autowired
protected Configuration configuration;
/**
* 解析字符串模板
*
* @param template 字符串模板
* @return 解析后内容
*/
public String process(String template) throws IOException, TemplateException {
Environment e =Environment.getCurrentEnvironment();
return process(template, e != null ? e.getDataModel() : null);
}
/**
* 解析字符串模板
*
* @param template 字符串模板
* @param model 数据
* @return 解析后内容
*/
public String process(String template, Object model) throws IOException, TemplateException {
Configuration configuration = this.configuration;
return process(template, model, configuration);
}
/**
* 解析字符串模板
*
* @param template 字符串模板
* @param model 数据
* @param configuration 配置
* @return 解析后内容
*/
public String process(String template, Object model, Configuration configuration) throws IOException, TemplateException {
if (template == null) {
return null;
}
StringWriter out = new StringWriter();
new Template("template", new StringReader(template), configuration != null ? configuration : this.configuration).process(model, out);
return out.toString();
}
}
@Component
public class GenerateSnUtils {
@Autowired
private GenerateSnConfiig generateSnConfiig;
@Autowired
private FreeMarkerProvider freeMarkerProvider;
/**
* 生成编号
**/
private String generate(String name) {
try {
String str = StringUtils.replaceAll(name);
String process = freeMarkerProvider.process(str);
return process;
} catch (TemplateException e) {
throw new CommonJsonException(e.getMessage());
} catch (IOException e) {
throw new CommonJsonException(e.getMessage());
}
}
/**
* 返回编号
**/
public String generateSn(Class<?> modelClass) throws IOException, TemplateException {
String process = null;
String name = modelName(modelClass);
switch (name) {
case "your tableName":
process = generate(generateSnConfiig.getCustomer());
break;
}
return process;
}
/**
* 获取实体类的表名
**/
public String modelName(Class<?> modelClass) {
TableName annotation = modelClass.getAnnotation(TableName.class);
return annotation.value();
}
}
5,使用方法
public abstract class BaseController{
@Autowired
private GenerateSnUtils generateSnUtils;
/**
* 根据类名生成编号
*
* @return
*/
public String generateSn(Class<?> className) {
try {
String sn = generateSnUtils.generateSn(className);
return sn;
} catch (TemplateException e) {
throw new CustomException(e.getMessage());
} catch (IOException e) {
throw new CustomException(e.getMessage());
}
}
}
6,调用
@RestController
@RequestMapping("/mumu")
public class IndexController extends BaseController{
@RequestMapping("/index")
public AjaxResult index(Role role){
//1 String sn=generateSn(User.class);
//2 String sn=generateSn(role.getClass())
}
}
最后
以上就是闪闪高跟鞋为你收集整理的使用freemarker生成后台编号的全部内容,希望文章能够帮你解决使用freemarker生成后台编号所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复