今天上午同事让我学习一个技术:jsengine。跟我说,要解决一个问题:由于目前这个项目采用的是前后端分离的形式,那么前后端都要对同一个对象或者说属性进行校验,防止出现空值或不符合格式的参数值。
但是jsengine这个没找到什么资料,倒是找到了别的:Java 8 Nashorn 教程(https://wizardforcel.gitbooks.io/modern-java/content/ch3.html,有兴趣的可以看看)
于是我写了个工具类,这样的话项目组的人以后都可以简单,方便的使用。
package com.palmyou.tengyun.common.utils; import com.palmyou.tengyun.common.exception.BusinessException; import org.apache.commons.lang3.StringUtils; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.io.FileReader; public class JavaScriptUtils { public static final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); /** * @param path js地址 * @param functionName js中将要执行的方法名字 * @param object 传入参数对象(如果是简单类型也要换成包装类型,例:int->Integer) * @param clazz 传入参数对象的class */ public static String evel(String path,String functionName,Object object,Class clazz) throws Exception{ if(StringUtils.isEmpty(path)){ throw new BusinessException("路径不能为空"); } if(StringUtils.isEmpty(functionName)){ throw new BusinessException("方法名不能为空"); } if(object == null){ throw new BusinessException("参数对象不能为空"); } if(clazz == null){ throw new BusinessException("参数对象Class不能为空"); } System.out.println(clazz.getResource(path).getPath()); engine.eval(new FileReader(clazz.getResource(path).getPath())); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction(functionName, object); return String.valueOf(result); } }
由于我们的项目是springboot的,所以common是一个单独的项目,所以我想获取别的项目里的js地址,那么必须得到别的项目里给我传的对象的Class。然后要用js里的方法必须要用new ScriptEngineManager().getEngineByName("nashorn")和Invocable invocable = (Invocable) engine。