在 java 代码中使用 Hybris 执行 groovy 脚本的可能性(无 hAC)

Possibilities to execute a groovy script with Hybris in java code (no hAC)

我想知道是否有办法使用 Hybris 执行 groovy 脚本。我知道如何使用 Hybris 管理控制台 (hAC) 执行 groovy 脚本,但我需要一个解决方案来从 java 代码执行这样的脚本。最好使用 Patching Framework 的 @SystemSetup 但不是必需的。 (https://help.sap.com/docs/SAP_COMMERCE/d0224eca81e249cb821f2cdf45a82ace/5db22427a1d541669bc4d12793a7b672.html?locale=en-US)

我正在寻找类似于 Impex 导入的方法(例如从核心扩展):

@SystemSetup(extension = SampleCoreConstants.EXTENSIONNAME)
public class CoreSystemSetup extends AbstractSystemSetup {

public static final String IMPORT_ACCESS_RIGHTS = "accessRights";

@SystemSetup(type = Type.ESSENTIAL, process = Process.ALL)
public void createEssentialData(final SystemSetupContext context)
{
    importImpexFile(context, "/samplecore/import/common/file-name.impex");
}

@Override
@SystemSetupParameterMethod
public List<SystemSetupParameter> getInitializationOptions()
{
    final List<SystemSetupParameter> params = new ArrayList<>();

    params.add(createBooleanSystemSetupParameter(IMPORT_ACCESS_RIGHTS, "Import Users & Groups", true));

    return params;
}

此处与SQL相同:https://www.stackextend.com/hybris/run-native-sql-query-hybris/

欢迎任何能帮助我解决问题的人(或者明确的答案,如果可能的话)。

谢谢!

可以在您的代码中 运行 groovy。即使在系统设置中。

您可以使用 hybris 服务(spring bean)de.hybris.platform.scripting.engine.ScriptingLanguagesService processing 扩展

中可用

在代码中,这可能类似于

final ClassPathResource resource = new ClassPathResource("location.groovy");
final ResourceScriptContent content = new ResourceScriptContent(resource);

ScriptExecutable groovyScript = scriptingLanguagesService.getExecutableByContent(content);

ScriptExecutionResult result = groovyScript.execute();

这将在类路径中的给定位置执行脚本。如果您的类路径中的文件中没有 groovy,则可能还有其他内容类型。例如:SimpleScriptContent

有很多要执行的groovy脚本。

方式一:

import org.springframework.core.io.Resource;
import org.springframework.core.io.FileSystemResource;
 
final Resource resource = new FileSystemResource("/Users/zeus/scripts/setMimesForMedias.groovy");

// Let's assume we have scriptingLanguagesService injected by the Spring
final ScriptContent scriptContent = new ResourceScriptContent(resource);
final ScriptExecutable executable = scriptingLanguagesService.getExecutableByContent(scriptContent);
 
// now we can execute script
final ScriptExecutionResult result = executable.execute();
 
// to obtain result of execution 
System.out.println(result.getScriptResult());

方式二: 我们可以使用如下简单的方法来实现。

示例代码如下:

import groovy.lang.Binding;
import groovy.lang.GroovyShell;



GroovyShell groovy = new GroovyShell(new Binding());
groovy.setVariable("text","Hello World!"); // you can variables here as many you needed
groovy.evaluate("println text"); // you can pass file as well instead of text

方法 3: 如果您想要 OOB,ScriptingJobPerformable 是 OOB class,您可以从中参考。

final ScriptExecutable executable = scriptingLanguagesService.getExecutableByURI(dynamicScriptingJob.getScriptURI());

    LOG.info("### Starting executing script : " + dynamicScriptingJob.getScriptURI() + " ###");
    final Map<String, Object> params = ImmutableMap.<String, Object>builder()//
                                                                             .put("cronjob", cronJob) //
                                                                             .put("log", LOG) //
                                                                             .build();
    final ScriptExecutionResult result = executable.execute(params);

详细解释请参考Scripting Engine