From 5797e54a2babed1109f09f85af804fc7430d0679 Mon Sep 17 00:00:00 2001
From: guoshengxiong <1923636941@qq.com>
Date: Tue, 19 Aug 2025 16:15:06 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0jdk17?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 77 ++++++++++-------
.../com/wflow/controller/AuthController.java | 4 +-
.../java/com/wflow/service/AuthService.java | 5 +-
.../wflow/service/impl/AuthServiceImpl.java | 4 +-
.../impl/SubModelGroupServiceImpl.java | 8 +-
src/main/java/com/wflow/utils/EmailUtil.java | 4 +-
src/main/java/com/wflow/utils/UserUtil.java | 2 +-
.../com/wflow/workflow/execute/JsExecute.java | 83 ++++++++++---------
.../impl/MemoryOrgOwnershipServiceImpl.java | 2 +-
.../impl/ProcessInstanceServiceImpl.java | 2 +-
.../workflow/task/TriggerServiceTask.java | 2 +-
11 files changed, 109 insertions(+), 84 deletions(-)
diff --git a/pom.xml b/pom.xml
index 102529e..df6fa21 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,82 +3,96 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
+
org.example
wflow-server
1.0-SNAPSHOT
-
+
org.springframework.boot
spring-boot-starter-parent
- 2.2.3.RELEASE
+ 3.5.4
-
+
- 8
- 8
- 1.8
+ 17
+ 17
+ 17
true
UTF-8
UTF-8
6.7.2
-
+
+
+ org.graalvm.js
+ js
+ 23.0.0
+
+ org.graalvm.js
+ js-scriptengine
+ 23.0.0
+
+ jakarta.annotation
+ jakarta.annotation-api
+ 2.1.1
+
+
org.projectlombok
lombok
1.18.20
-
+
com.alibaba.fastjson2
fastjson2
- 2.0.40
+ 2.0.42
-
-
+
+
com.baomidou
mybatis-plus-boot-starter
- 3.4.2
+ 3.5.3.2
-
+
mysql
mysql-connector-java
5.1.49
-
+
cn.dev33
sa-token-spring-boot-starter
1.30.0
-
+
org.springframework.boot
spring-boot-starter-test
test
-
+
org.springframework.boot
spring-boot-starter-mail
-
+
cn.hutool
hutool-all
5.8.16
-
+
com.belerweb
pinyin4j
@@ -90,7 +104,7 @@
spring-file-storage
0.5.0
-
+
org.flowable
flowable-spring-boot-starter-actuator
@@ -102,35 +116,35 @@
-
+
com.googlecode.aviator
aviator
5.3.1
-
+
org.springframework.boot
spring-boot-starter-web
-
+
org.springframework.boot
spring-boot-starter-test
-
+
org.javadelight
delight-nashorn-sandbox
0.3.2
-
+
-
+
org.springframework.boot
spring-boot-devtools
@@ -149,7 +163,7 @@
2.11.4
-
+
+
+ --enable-preview
+
diff --git a/src/main/java/com/wflow/controller/AuthController.java b/src/main/java/com/wflow/controller/AuthController.java
index 3930e93..1981f6a 100644
--- a/src/main/java/com/wflow/controller/AuthController.java
+++ b/src/main/java/com/wflow/controller/AuthController.java
@@ -6,8 +6,8 @@ import com.wflow.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/wflow/service/AuthService.java b/src/main/java/com/wflow/service/AuthService.java
index 1947499..806609b 100644
--- a/src/main/java/com/wflow/service/AuthService.java
+++ b/src/main/java/com/wflow/service/AuthService.java
@@ -2,8 +2,9 @@ package com.wflow.service;
import com.wflow.bean.vo.UserLoginVo;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
import java.io.IOException;
/**
diff --git a/src/main/java/com/wflow/service/impl/AuthServiceImpl.java b/src/main/java/com/wflow/service/impl/AuthServiceImpl.java
index 4a6fc53..869acdc 100644
--- a/src/main/java/com/wflow/service/impl/AuthServiceImpl.java
+++ b/src/main/java/com/wflow/service/impl/AuthServiceImpl.java
@@ -14,8 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/src/main/java/com/wflow/service/impl/SubModelGroupServiceImpl.java b/src/main/java/com/wflow/service/impl/SubModelGroupServiceImpl.java
index d169fb0..8145841 100644
--- a/src/main/java/com/wflow/service/impl/SubModelGroupServiceImpl.java
+++ b/src/main/java/com/wflow/service/impl/SubModelGroupServiceImpl.java
@@ -62,9 +62,9 @@ public class SubModelGroupServiceImpl implements SubModelGroupService {
@Override
public void addGroup(String name) {
- Integer count = subGroupsMapper.selectCount(
+ Integer count = Math.toIntExact(subGroupsMapper.selectCount(
new LambdaQueryWrapper()
- .eq(WflowSubGroups::getGroupName, name));
+ .eq(WflowSubGroups::getGroupName, name)));
if (count > 0) {
throw new BusinessException("分组名称不能重复");
}
@@ -78,9 +78,9 @@ public class SubModelGroupServiceImpl implements SubModelGroupService {
if (id.equals(0) || id.equals(1)){
throw new BusinessException("不允许删除系统内置分组");
}
- Integer count = subProcessMapper.selectCount(
+ Integer count = Math.toIntExact(subProcessMapper.selectCount(
new LambdaQueryWrapper()
- .eq(WflowSubProcess::getGroupId, id));
+ .eq(WflowSubProcess::getGroupId, id)));
if (count > 0) {
throw new BusinessException("请先删除分组内的流程");
}
diff --git a/src/main/java/com/wflow/utils/EmailUtil.java b/src/main/java/com/wflow/utils/EmailUtil.java
index 7649e1c..e8f2fb6 100644
--- a/src/main/java/com/wflow/utils/EmailUtil.java
+++ b/src/main/java/com/wflow/utils/EmailUtil.java
@@ -7,8 +7,8 @@ import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
+import jakarta.mail.MessagingException;
+import jakarta.mail.internet.MimeMessage;
/**
* @author : willian fu
diff --git a/src/main/java/com/wflow/utils/UserUtil.java b/src/main/java/com/wflow/utils/UserUtil.java
index 4f85228..99b4a78 100644
--- a/src/main/java/com/wflow/utils/UserUtil.java
+++ b/src/main/java/com/wflow/utils/UserUtil.java
@@ -6,7 +6,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;
/**
diff --git a/src/main/java/com/wflow/workflow/execute/JsExecute.java b/src/main/java/com/wflow/workflow/execute/JsExecute.java
index 8e29698..8c677b9 100644
--- a/src/main/java/com/wflow/workflow/execute/JsExecute.java
+++ b/src/main/java/com/wflow/workflow/execute/JsExecute.java
@@ -1,14 +1,10 @@
package com.wflow.workflow.execute;
-import cn.hutool.http.HttpRequest;
-import com.wflow.exception.BusinessException;
-import delight.nashornsandbox.NashornSandbox;
-import delight.nashornsandbox.NashornSandboxes;
-import jdk.nashorn.api.scripting.ScriptObjectMirror;
import lombok.extern.slf4j.Slf4j;
+import org.graalvm.polyglot.Context;
+import org.graalvm.polyglot.HostAccess;
+import org.graalvm.polyglot.Value;
-import javax.script.Invocable;
-import javax.script.ScriptException;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
@@ -19,49 +15,58 @@ import java.util.concurrent.ExecutorService;
@Slf4j
public class JsExecute {
- //创建执行沙箱环境
- private static NashornSandbox sandbox;
-
- //TODO 这里配置允许暴露给的java类,可以在js里面直接调用
private static final Class[] alowJsCallJavaClass = new Class[]{
- HttpRequest.class, System.class
+ //HttpRequest.class, System.class
+ // GraalVM的HostAccess默认允许访问一些常见的类,例如System
+ // 如果你需要访问自定义的类,你需要在这里配置
};
+ private static Context context;
+ // 使用 Context.Builder 来创建和配置沙箱环境
public JsExecute(ExecutorService executorService) {
- if (Objects.isNull(sandbox)) {
- sandbox = NashornSandboxes.create();
- //沙箱资源限制
- sandbox.setMaxCPUTime(20000);
- sandbox.setMaxMemory(10 * 1024 * 1024);
- sandbox.allowNoBraces(false);
- sandbox.setMaxPreparedStatements(30);
- sandbox.setExecutor(executorService);
- sandbox.allowGlobalsObjects(true);
- sandbox.allowPrintFunctions(true);
- sandbox.disallowAllClasses();
- //这里配置允许暴露的java类,可以在js里面直接调用
- for (Class clazz : alowJsCallJavaClass) {
- sandbox.allow(clazz);
- }
+ if (Objects.isNull(context)) {
+ // 使用 Context.Builder 来创建和配置 GraalVM 沙箱
+ context = Context.newBuilder("js")
+ .allowHostAccess(HostAccess.ALL) // 允许访问所有Java对象
+ // 如果只想允许特定类,可以使用HostAccess.newBuilder()
+ .allowHostClassLookup(s -> true) // 允许查找所有Java类
+ // 如果只想允许特定类,可以配置如下:
+ // .allowHostClassLookup(className -> {
+ // return className.equals("com.yourpackage.HttpRequest") || className.equals("java.lang.System");
+ // })
+ .allowAllAccess(true) // 允许所有访问,包括I/O、线程等
+ .option("engine.WarnInterpreterOnly", "false") // 忽略解释器模式警告
+ .build();
+
+ // GraalVM的资源限制配置有所不同,通常是在创建context时设置,或者通过线程池等外部方式管理。
+ // 例如,CPU时间限制等需要通过更复杂的机制实现,Context.Builder不直接支持MaxCPUTime等。
+ // 内存限制通常通过JVM的-Xmx参数来控制。
+ // 你可以继续使用你传入的ExecutorService来控制并发。
+
}
}
public T execute(String func, String script, Class resultType, Object... args) {
- Invocable invocable = sandbox.getSandboxedInvocable();
try {
- sandbox.eval(script);
- Object result = invocable.invokeFunction(func, args);
- log.debug("资源服务执行js解码结果[{}]", result);
- if (result instanceof ScriptObjectMirror) {
- //返回的是js对象 = Map
- return ((ScriptObjectMirror) result).to(resultType);
- } else {
- //返回普通类型数据
- return resultType.cast(result);
+ // 注意:GraalVM 的 Context.eval() 有两种重载,
+ // 一种是直接执行,另一种是带源文件名的,这里简化使用
+ context.eval("js", script);
+
+ // 获取 JavaScript 函数
+ Value function = context.getBindings("js").getMember(func);
+ if (function == null || !function.canExecute()) {
+ throw new NoSuchMethodException("Function " + func + " not found or not executable.");
}
- } catch (ScriptException | NoSuchMethodException e) {
+
+ // 执行函数并获取结果
+ Value result = function.execute(args);
+
+ // 使用 Value.as() 方法进行类型转换,这是 GraalVM 推荐的方式
+ return result.as(resultType);
+
+ } catch (Exception e) {
log.error("js 函数[{}] [{}]执行异常: [{}]", func, script, e.getMessage());
- throw new BusinessException("js函数解析执行异常:" + e.getMessage());
+ throw new RuntimeException("js函数解析执行异常:" + e.getMessage(), e);
}
}
diff --git a/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java
index f917d5e..827a120 100644
--- a/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java
+++ b/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java
@@ -8,11 +8,11 @@ import com.wflow.bean.vo.DeptVo;
import com.wflow.service.OrgRepositoryService;
import com.wflow.service.OrgUserAndDeptService;
import com.wflow.workflow.service.OrgOwnershipService;
+import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
diff --git a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java
index 0d15104..708c2e7 100644
--- a/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java
+++ b/src/main/java/com/wflow/workflow/service/impl/ProcessInstanceServiceImpl.java
@@ -600,7 +600,7 @@ public class ProcessInstanceServiceImpl implements ProcessInstanceService {
@Override
public InstanceCountVo getProcessInstanceCount() {
String userId = UserUtil.getLoginUserId();
- Integer cc = ccTasksMapper.selectCount(new LambdaQueryWrapper().eq(WflowCcTasks::getUserId, userId));
+ Integer cc = Math.toIntExact(ccTasksMapper.selectCount(new LambdaQueryWrapper().eq(WflowCcTasks::getUserId, userId)));
Long todo = taskService.createTaskQuery().taskCandidateOrAssigned(userId).count();
Long mySubmited = historyService.createHistoricProcessInstanceQuery().startedBy(userId).unfinished().count();
return InstanceCountVo.builder().todo(todo).mySubmited(mySubmited).cc(cc.intValue()).build();
diff --git a/src/main/java/com/wflow/workflow/task/TriggerServiceTask.java b/src/main/java/com/wflow/workflow/task/TriggerServiceTask.java
index baebb1c..31e36b9 100644
--- a/src/main/java/com/wflow/workflow/task/TriggerServiceTask.java
+++ b/src/main/java/com/wflow/workflow/task/TriggerServiceTask.java
@@ -15,7 +15,7 @@ import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
-import javax.mail.MessagingException;
+import jakarta.mail.MessagingException;
import java.util.List;
import java.util.Map;
import java.util.Optional;