Forge 的 Java 服务增强用于把已经开发、评审和部署的 Java 业务能力,绑定到低代码应用的标准触发点。平台不会在线编译 Java,也不接受 Bean 名、Class 名或反射路径。
LowcodeExtensionHandler。@Component 注册为 Spring Bean。package com.example.forge.extension;
import com.mdframe.forge.plugin.generator.service.businessapp.extension.ExtensionExecutionContext;
import com.mdframe.forge.plugin.generator.service.businessapp.extension.ExtensionExecutionResult;
import com.mdframe.forge.plugin.generator.service.businessapp.extension.ExtensionInputField;
import com.mdframe.forge.plugin.generator.service.businessapp.extension.LowcodeExtensionHandler;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;
@Component
public class PurchaseAmountCheckHandler implements LowcodeExtensionHandler {
@Override
public String handlerCode() {
return "purchase_amount_check";
}
@Override
public String handlerName() {
return "采购金额校验";
}
@Override
public Set<String> allowedHooks() {
return Set.of("BEFORE_CREATE", "BEFORE_UPDATE", "BEFORE_SUBMIT");
}
@Override
public Map<String, ExtensionInputField> inputSchema() {
return Map.of(
"amount", ExtensionInputField.required("NUMBER"),
"currency", ExtensionInputField.optional("STRING")
);
}
@Override
public Map<String, ExtensionInputField> outputSchema() {
return Map.of("normalizedAmount", ExtensionInputField.required("NUMBER"));
}
@Override
public int timeoutMs() {
return 800;
}
@Override
public String riskLevel() {
return "MEDIUM";
}
@Override
public String requiredPermission() {
return "purchase:order:edit";
}
@Override
public ExtensionExecutionResult execute(ExtensionExecutionContext context) {
Number inputAmount = (Number) context.getInput().get("amount");
BigDecimal amount = new BigDecimal(inputAmount.toString());
if (amount.signum() < 0) {
return ExtensionExecutionResult.failure("AMOUNT_NEGATIVE", "采购金额不能小于零");
}
return ExtensionExecutionResult.success(Map.of("normalizedAmount", amount));
}
}
handlerCode 必须以小写字母开头,只包含小写字母、数字和下划线,长度 2~64。allowedHooks 必须使用 Forge 标准钩子;前端触发矩阵会自动禁用处理器未声明的钩子。inputSchema 声明的字段,未知字段会被拒绝。STRING、LONG/INTEGER、NUMBER/DECIMAL、BOOLEAN、OBJECT/MAP、ARRAY/LIST。requiredPermission 非空时,当前用户必须拥有对应权限。success=false 会记录失败审计;失败策略为“阻断”时中止当前业务动作。处理器由固定线程池执行。平台会验证租户、操作者、应用、对象、入口、版本、钩子和输入结构,并记录处理器编码、扩展版本、执行耗时、成功状态及脱敏错误摘要。