Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Drools-资源既没有源路径也没有目标路径_Spring Boot_Drools_Drools Kie Server - Fatal编程技术网

Spring boot Drools-资源既没有源路径也没有目标路径

Spring boot Drools-资源既没有源路径也没有目标路径,spring-boot,drools,drools-kie-server,Spring Boot,Drools,Drools Kie Server,我对Drools非常陌生,并调整了我发现的Spring引导配置,使我能够从数据库中以字符串的形式读取一组规则,而不是从应用程序文件夹中的DRL文件中读取它们 当我使用下面的代码启动应用程序时,我将使用Spring Boot、Drools 6.5.Final和Java 1.8获得以下异常: 原因:java.lang.RuntimeException:资源既没有也没有 源路径或目标路径。无法将其添加到捆绑包中。请 在添加之前设置资源的源名称或目标名称 它在 org.drools.compiler.k

我对Drools非常陌生,并调整了我发现的Spring引导配置,使我能够从数据库中以字符串的形式读取一组规则,而不是从应用程序文件夹中的DRL文件中读取它们

当我使用下面的代码启动应用程序时,我将使用Spring Boot、Drools 6.5.Final和Java 1.8获得以下异常:

原因:java.lang.RuntimeException:资源既没有也没有 源路径或目标路径。无法将其添加到捆绑包中。请 在添加之前设置资源的源名称或目标名称 它在 org.drools.compiler.kie.builder.impl.KieFileSystemImpl.write(KieFileSystemImpl.java:95) ~[drools-compiler-6.5.0.Final.jar:6.5.0.Final]

package com.example.demo;
导入java.io.ByteArrayInputStream;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.util.ArrayList;
导入java.util.List;
导入org.kie.api.KieBase;
导入org.kie.api.KieServices;
导入org.kie.api.builder.KieBuilder;
导入org.kie.api.builder.kie文件系统;
导入org.kie.api.builder.kie模块;
导入org.kie.api.builder.kie存储库;
导入org.kie.api.builder.ReleaseId;
导入org.kie.api.io.Resource;
导入org.kie.api.runtime.KieContainer;
导入org.kie.api.runtime.KieSession;
导入org.kie.internal.io.ResourceFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
@配置
公共类DroolsDatabaseConfig{
@自动连线
私有数据服务数据服务;
@豆子
公共文件系统KieFileSystem()引发IOException{
KieFileSystem KieFileSystem=getKieServices().newKieFileSystem();
for(资源:getRulesFromDB()){
kieFileSystem.write(资源);
}        
返回文件系统;
}
私有列表getRulesFromDB()引发IOException{
List resources=new ArrayList();
List rules=dataService.getRulesFromDB();
for(字符串规则:规则){
Resource r=ResourceFactory.newInputStreamResource(new ByteArrayInputStream(rule.getBytes(StandardCharsets.UTF_8));
增加(r);
}
归还资源;
}
@豆子
public KieContainer()引发IOException{
final KieRepository KieRepository=getKieServices().getRepository();
addKieModule(新的KieModule(){
public ReleaseId getReleaseId(){
返回kieRepository.getDefaultReleaseId();
}
});
KieBuilder KieBuilder=getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
返回getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
私人服务getKieServices(){
return.services.Factory.get();
}
@豆子
public KieBase KieBase()引发IOException{
返回kieContainer().getKieBase();
}
@豆子
公共会话KieSession()引发IOException{
返回kieContainer().newKieSession();
}
}
关于如何解决这个问题以允许我从字符串加载规则,有什么想法吗


提前感谢

我不确定这样做是否正确,但我能够将资源源路径设置为任意字符串值,以防止文件系统抛出错误:
r.setSourcePath(“任意字符串”)
package com.example.demo;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.ReleaseId;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DroolsDatabaseConfig {

    @Autowired
    private DataService dataService;

    @Bean
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
        for (Resource resource : getRulesFromDB()) {
            kieFileSystem.write(resource);
        }        
        return kieFileSystem;
    }

    private List<Resource> getRulesFromDB() throws IOException {
        List<Resource> resources = new ArrayList<Resource>();

        List<String> rules = dataService.getRulesFromDB();
        for (String rule : rules){
            Resource r = ResourceFactory.newInputStreamResource(new ByteArrayInputStream(rule.getBytes(StandardCharsets.UTF_8)));
            resources.add(r);
        }
        return resources;
    }

    @Bean
    public KieContainer kieContainer() throws IOException {
        final KieRepository kieRepository = getKieServices().getRepository();

        kieRepository.addKieModule(new KieModule() {
            public ReleaseId getReleaseId() {
                return kieRepository.getDefaultReleaseId();
            }
        });

        KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()); 
        kieBuilder.buildAll();

        return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
    }

    private KieServices getKieServices() {
        return KieServices.Factory.get();
    }

    @Bean
    public KieBase kieBase() throws IOException {
        return kieContainer().getKieBase();
    }

    @Bean
    public KieSession kieSession() throws IOException {
        return kieContainer().newKieSession();
    }
}