Liferay 只有一种类型可以导入drools

Liferay 只有一种类型可以导入drools,liferay,drools,Liferay,Drools,我正在使用Drools和Liferay,当规则为真时,我试图在BD中插入一个用户,但Drools不允许我导入包。我没有.drl类,我传递一个字符串来执行drools。这是我的代码: 代码流: import com.liferay.portal.kernel.search.BooleanClause; import com.liferay.portal.kernel.search.BooleanClauseOccur; import com.liferay.portal.kernel.search

我正在使用Drools和Liferay,当规则为真时,我试图在BD中插入一个用户,但Drools不允许我导入包。我没有.drl类,我传递一个字符串来执行drools。这是我的代码:

代码流:

import com.liferay.portal.kernel.search.BooleanClause;
import com.liferay.portal.kernel.search.BooleanClauseOccur;
import com.liferay.portal.kernel.search.BooleanClauseFactoryUtil;
import com.liferay.portal.kernel.search.BooleanQuery;
import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistryUtil;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.KeyValuePair;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.Address;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.Contact;
import com.liferay.portal.model.User;
import com.liferay.portal.service.AddressLocalServiceUtil;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.asset.model.AssetEntry;
import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
import com.liferay.portal.model.User;
import com.liferay.portal.security.auth.PrincipalThreadLocal;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
import com.liferay.portal.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.util.ObjectValuePair;
import com.liferay.portlet.expando.model.ExpandoBridge;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.segmentationPortlet.controller.prova;

rule "Initialize Rules"
salience 1000
when
    user : User(); 
then
end

rule "Rule_1"
when 
    userRule_2: User(emailAddress == "test@liferay.com")
user: User();
then
    prova p;
    p.classification(user,"SegmentUser");
end
执行Drools的代码; //rule是一个包含Drools代码的字符串。 主题显示td=(主题显示)actionRequest.getAttribute(WebKeys.THEME\u DISPLAY); User=td.getUser(); 添加(新事实(“用户”,用户))

prova.java代码: 包com.segmentationPortlet.controller

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.model.User;
import com.segmentationPortlet.model.UserRule;
import com.segmentationPortlet.service.UserRuleLocalServiceUtil;
import com.segmentationPortlet.service.persistence.UserRulePK;

public class prova {
    public void classification(User user, String segmentValue)  {
        try {
            UserRule ur = null ;
            long id1 = CounterLocalServiceUtil.increment(UserRule.class.getName());
            long id2 = CounterLocalServiceUtil.increment(UserRule.class.getName());
            UserRulePK u = new UserRulePK(id1, id2); 
            ur= UserRuleLocalServiceUtil.createUserRule(u);
            Long id = (long) 1234;
            ur.setUserId(user.getUserId());
            ur.setRuleId(id);
            ur.setSegment(segmentValue);
            UserRuleLocalServiceUtil.addUserRule(ur);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 }`
当我尝试执行时,出现以下错误:

原因:com.liferay.portal.kernel.bi.rules.RulesEngineException:导入错误:“com.segmentationPortlet.controller.prova” 导入时出错:“com.segmentationPortlet.controller.Classification.Classification” 导入错误:“com.segmentationPortlet.controller.GetCustomAttribute.GetCustomAttribute” [函数getCustomAttributegetCustomAttribute(第53行):只能导入类型。com.segmentationPortlet.controller.prova解析为包 ] [函数分类分类(第35行):只能导入类型。com.segmentationPortlet.controller.prova解析为包 ] [函数getCustomAttributegetCustomAttribute(第53行):只能导入类型。com.segmentationPortlet.controller.prova解析为包 ]

有没有办法解决这个问题

非常感谢。

问题是您的类名没有遵循Java的良好实践:类名以大写字母开头。Drools似乎对此相当认真:)

将类名更改为*p*rova,应该可以正常工作

编辑:忘记这个响应。我在测试这个场景时犯了一个错误。请看我的其他回答


希望有帮助,让我们重新开始。通过在drl中导入一个不存在的类,我成功地再现了错误消息。因此,请仔细检查.drl文件中的导入是否指向正确的“prova”类。还要确保drools的引擎在运行时可以访问该类(该类必须位于类路径中)

顺便问一下,你使用的是哪种版本的drools?根据5.5.0,第二条规则的RHS应在编译期间失败,并显示以下消息:“规则编译错误局部变量p可能尚未初始化”

希望能有帮助,我解决了这个问题。
这段代码是动态生成并执行的,然后我必须创建一个新项目,创建.jar并将其移动到/tomcat/lib/ext,以便permet Drools访问它。

我检查了导入,它是正确的。我尝试将类添加到类路径,这样做:在项目名称中单击“属性”->“Java构建路径”,然后在“库”中单击添加Class Folder“并选择类”Prova.java所在的文件夹/src/com/controller”“是的。但是当我执行代码的时候,我有同样的错误。是的,我使用的是Drools 5.5.0,但是我没有这个错误,因为代码还不能执行。我试着在Windows的类路径中放置Prova.java的de path,但它也不起作用。谢谢。我检查了进口,它是正确的。我尝试这样将类添加到类路径:在项目名称中单击“属性”->“Java构建路径”,在“库”中单击“添加类文件夹”,并选择类“Prova.Java”所在的文件夹/src/com/controller。但是当我执行代码的时候,我有同样的错误。是的,我使用的是Drools 5.5.0,但是我没有这个错误,因为代码还不能执行。谢谢
import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.model.User;
import com.segmentationPortlet.model.UserRule;
import com.segmentationPortlet.service.UserRuleLocalServiceUtil;
import com.segmentationPortlet.service.persistence.UserRulePK;

public class prova {
    public void classification(User user, String segmentValue)  {
        try {
            UserRule ur = null ;
            long id1 = CounterLocalServiceUtil.increment(UserRule.class.getName());
            long id2 = CounterLocalServiceUtil.increment(UserRule.class.getName());
            UserRulePK u = new UserRulePK(id1, id2); 
            ur= UserRuleLocalServiceUtil.createUserRule(u);
            Long id = (long) 1234;
            ur.setUserId(user.getUserId());
            ur.setRuleId(id);
            ur.setSegment(segmentValue);
            UserRuleLocalServiceUtil.addUserRule(ur);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 }`