[英]Drools rule does't working in Spring Boot Controller but working in Junit Test
在我学习流口水的第一天。我遇到了这个奇怪的问题。
drl 中的规则“ Hello World ”无法在 Controller 中运行,但在 Junit 测试用例中运行良好。 规则“另一个规则”总是在 Controller 和 Junit 测试上运行。
控制器和junit测试中的代码完全一样。
欢迎任何有想法的人。 谢谢 。
示例.drl:
package com.happylifeplat.checkin
import com.happylifeplat.checkin.managerorder.beans.RaBean1;
rule "Hello World"
when
$h : RaBean1( id == 1)
then
$h.setContent("from drl content");
System.out.println("-----Hello World rule called id == 1");
end
rule "Another rule"
when
then
System.out.println("-----Another rule called");
end
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>
RaBean1.java:
package com.happylifeplat.checkin.managerorder.beans;
public class RaBean1 {
private int id;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
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>
我也面临同样的问题。 在我的情况下,原因是由于 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.