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;