Java Drools规则没有';t在Spring引导控制器中工作,但在Junit测试中工作
在我学口水的第一天,我遇到了一个奇怪的问题 drl中的规则“Hello World”无法在控制器中运行,但在Junit测试用例中运行良好。 规则“另一个规则”始终在控制器和Junit测试上运行 controller和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/
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>