Java Drools规则没有';t在Spring引导控制器中工作,但在Junit测试中工作

Java Drools规则没有';t在Spring引导控制器中工作,但在Junit测试中工作,java,spring,junit,drools,Java,Spring,Junit,Drools,在我学口水的第一天,我遇到了一个奇怪的问题 drl中的规则“Hello World”无法在控制器中运行,但在Junit测试用例中运行良好。 规则“另一个规则”始终在控制器和Junit测试上运行 controller和junit测试中的代码完全相同 任何有想法的人都欢迎。 谢谢 Sample.drl: kmodule.xml: <?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://jboss.org/kie/

在我学口水的第一天,我遇到了一个奇怪的问题

drl中的规则“Hello World”无法在控制器中运行,但在Junit测试用例中运行良好。 规则“另一个规则”始终在控制器和Junit测试上运行

controller和junit测试中的代码完全相同

任何有想法的人都欢迎。 谢谢


Sample.drl:

kmodule.xml:

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>
HelloController.java:

@RestController
@RequestMapping("/hello")
public class HelloController {

    private static KieContainer kieContainer;
    private KieSession sessionStatefull = null;

    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    @ApiOperation(value = "hello")
    public Result metadata() {
        try {
            if (kieContainer == null) {
                kieContainer = KnowledgeSessionHelper.createRuleBase();
            }
            sessionStatefull = KnowledgeSessionHelper.getStatefulKnowledgeSessionWithCallback(kieContainer, "ksession-rules");
            RaBean1 bean1 = new RaBean1();
            bean1.setId(1);
            bean1.setContent("default content");
            sessionStatefull.insert(bean1);
            sessionStatefull.fireAllRules();
            return new Result(CommonCode.sussess, bean1.getContent());
        } catch (Exception e) {
            return new Result(CommonCode.fail, null);
        }
    }
}
HelloControllerTest.java:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ImportResource({"classpath:spring/applicationContext.xml"})
@IntegrationTest("server.port=0")
@WebAppConfiguration
public class HelloControllerTest {
    private static final Logger log = LoggerFactory.getLogger(HelloControllerTest.class);
    private MockMvc mockMvc;
    private static KieContainer kieContainer;
    private KieSession sessionStatefull = null;

    @Before
    public void setUp() throws Exception {
//        mockMvc = MockMvcBuilders.standaloneSetup(managerOrderController).build();
    }

    @Test
    public void helloTest() throws Exception {
        if (kieContainer == null) {
            kieContainer = KnowledgeSessionHelper.createRuleBase();
        }
        sessionStatefull = KnowledgeSessionHelper.getStatefulKnowledgeSessionWithCallback(kieContainer, "ksession-rules");
        RaBean1 bean1 = new RaBean1();
        bean1.setId(1);
        bean1.setContent("default content");
        sessionStatefull.insert(bean1);
        sessionStatefull.fireAllRules();
        System.out.println("rabean.getContent---->"+bean1.getContent());
    }
}

最后一个朋友帮助了我。 这是因为“热部署”。 关闭它,然后问题就解决了

它位于pom.xml中:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

org.springframework.boot
弹簧靴开发工具
真的

我也面临同样的问题。 在我的例子中,原因是由于dev-tools依赖关系导致的冲突。
删除冲突的依赖项后,它开始为我工作。

我们仍然可以使用开发工具,方法是在资源文件夹的META-INF/spring-devtools.properties文件中添加这一行
restart.include.dools=/(drools | kie)\-.*.jar

我删除了它的工作依赖项

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

org.springframework.boot
弹簧靴开发工具
运行时
真的

我怀疑是否执行了HelloController的“元数据”方法。添加println以确定已执行插入。另外,将一些代码放入“另一个规则”的结果中,以统计WM中的事实并将该数字添加到消息中。日志显示“insert”已执行bean。在此添加更多详细信息:当我编写“sessionStatefull.setGlobal(…”)时,它报告一个错误:java.lang.RuntimeException:global.Expected的非法类[com.happylifeplat.checkin.utils.DroolsOutputUtil]找到[com.happylifeplat.checkin.utils.DroolsOutputUtil]。看起来项目中的对象不在drools系统的空间中。任何将bean放入drl文件的操作都将失败。还有一点很重要:当我对项目进行“mvn打包”时,然后使用“java-jar”要运行这个jar文件并发送http请求,一切都正常。“Hello World”规则运行!我想这是因为我的Intellj想法。(jboss的文档推荐eclipse)在触发规则的结果中使用代码列出工作内存中所有事实的类名。这节省了我的时间。除了setGlobal()中的不匹配之外,即使切换到无状态会话也无济于事,因为classObjectType正在跳过规则执行,因为isAssignableFrom()将失败,尽管源对象和目标对象是同一个类对象。非常感谢您记录这一点。
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>