我得到了这样一个案例:
我得到了一个包含以下代码的java类:
private static final int INVALID_PARAM = -1;
private static final int AGE = 1;
private static final int BLOOD_PREASURE = 3;
@GET
@Path("/execute")
public String execute(@Context HttpServletRequest req) {
try {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(getSrc(req.getServletContext().getRealPath("js/boot.js")));
engine.eval(getSrc(req.getServletContext().getRealPath("js/test.js")));
Invocable invocable = (Invocable) engine;
Function<Integer, Object> fn = (arg) -> {
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget rtarget = client.target("http://localhost:8080/DSS-war/rest/bl");
BlRest rest = rtarget.proxy(BlRest.class);
switch(arg) {
case AGE:
int age = rest.age();
client.close();
return age;
case BLOOD_PREASURE:
int bloodPreasure = rest.bloodPreasure();
client.close();
return bloodPreasure;
}
return INVALID_PARAM;
};
invocable.invokeFunction("init", fn);
Object res = invocable.invokeFunction("f", 5);
return res.toString();
}catch(
ScriptException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}catch(
NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return"Error";
}
也是boot.js文件:
var dss;
var AGE = 1;
var INVALID_PARAM = -1;
var BLOOD_PREASURE = 1;
function init(d) {
dss = d;
}
也是test.js文件:
function f(x) {
var age = dss(AGE);
return age;
}
function f2(x) {
var bloodPreasure = dss(BLOOD_PREASURE);
return bloodPreasure;
}
function c(callback) {
return callback("from callback");
}
也是一个界面
@GET
@Path("/age")
@Produces(MediaType.APPLICATION_JSON)
public int age();
@GET
@Path("/blood_preasure")
@Produces(MediaType.APPLICATION_JSON)
public int bloodPreasure();
也是实现该接口的类
@Stateless
@LocalBean
@Path("/bl")
public class Blulinea implements BlRest{
@Override
public int age() {
return 65;
}
@Override
public int bloodPreasure() {
return 150;
}
}
所有这些都通过html页面上的href链接起作用
好的......现在,我首先在test.js文件中只有f函数....并且从会话bean中的execute函数调用它...并且一旦我按下链接它就可以了,它显示65岁,适合年龄......
现在,我添加了一个新功能f2,用于血液预测......并将所有关于它的部分添加到代码中.... 完成后,我使用以下代码调用f2函数:
Object res = invocable.invokeFunction("f2", 5);
女巫我放入了执行方法...但是当我按下页面上的href链接时,它再次显示65(年龄) 然后我试图找到一个解决方案,我发现,在执行方法中我调用的函数f和f2都无关紧要......但是我在文件顶部声明了常量....
private static final int AGE = 1;
private static final int BLOOD_PREASURE = 3;
这两个参数,决定调用哪个函数......
如果年龄小于blood_preasure则会调用age函数,否则将调用blood_preasure函数.... ofc bc of switch case ...
但我需要能够像这样调用正确的函数
Object res = invocable.invokeFunction("f", 5);
或
Object res = invocable.invokeFunction("f2", 5);
尽管在开关中常量....的值较低 Ofc,如果我将值更改为2或更高,则交换机ll给出-1
lambda函数中的arg参数总是1 ... mby你可以告诉我一个用invokeFunction改变它的方法
我希望你能解决我的问题并帮助我...
答案 0 :(得分:0)
我发现答案......在启动文件中是这样的:
var AGE = 1;
var INVALID_PARAM = -1;
var BLOOD_PREASURE = 1;
并且存在问题,应该是AGE = 1且BLOOD_PREASURE = 2
那么它有效......