我喜欢JDK附带ScriptEngine的事实。 当您要评估服务器环境中已经部署的应用程序并进行故障排除时,它非常灵活。 将此REST端点添加到Java EE应用程序中,它将使您可以立即访问该应用程序的内部状态。
package myrestapp;
import java.io.StringReader;
import java.util.logging.Logger;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
/**
* Give instant access to your internal application with dynamic scripting.
*
* <p>Example script:
* <pre>
* "sc" + servletContext + ", req=" + request;
* </pre>
*
* <p>Example2
* <pre>
* names = servletContext.getAttributeNames();
* while(names.hasMoreElements()) {
* name = names.nextElement();
* println(name);
* }
* </pre>
*/
@Path("script")
public class ScriptResource {
private static final Logger logger = Logger.getLogger(ScriptResource.class.getName());
@Context
private ServletContext servletContext;
@POST
public String script(@Context HttpServletRequest request, String scriptText) throws Exception {
String engineName = "JavaScript";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(engineName);
logger.info("Running script text length=" + scriptText.length() + ", engine=" + engine);
Object result = null;
try (StringReader reader = new StringReader(scriptText)) {
Bindings bindings = engine.createBindings();
bindings.put("servletContext", servletContext);
bindings.put("request", request);
result = engine.eval(reader, bindings);
}
logger.info("Result " + result);
return "" + result;
}
}
注意,我已经在注释区域中给出了两个JavaScript示例。 您将可以访问两个绑定变量,这两个变量应该使您可以完全访问应用程序的许多内部组件。
需要一个UI来测试此端点吗? 尝试一下“ Advance Rest Client” Chrome扩展程序怎么样? (感谢我的同事Chris Griffin在这个很酷的扩展上的提示。它确实很方便!)。