只有一种类型可以导入drools

时间:2013-09-09 07:13:27

标签: 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.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代码的字符串。     ThemeDisplay td =(ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);     用户user = td.getUser();     facts.add(新事实(“用户”,用户));

RulesResourceRetriever rulesResourceRetriever = new RulesResourceRetriever(new                                          StringResourceRetriever(rule), String.valueOf(RulesLanguage.                 RulesEngineUtil.update(domainName, rulesResourceRetriever,      PortalClassLoaderUtil.getClassLoader());
RulesEngineUtil.execute(domainName, facts, Query.createStandardQuery(),      PortalClassLoaderUtil.getClassLoader());`

prova.java代码:     package 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' [function getCustomAttributegetCustomAttribute(line:53):只能导入一个类型。 com.segmentationPortlet.controller.prova解析为一个包  ] [function classificationclassification(line:35):只能导入一个类型。 com.segmentationPortlet.controller.prova解析为一个包  ] [function getCustomAttributegetCustomAttribute(line:53):只能导入一个类型。 com.segmentationPortlet.controller.prova解析为一个包  ]

我不知道如何解决问题?

非常感谢。

3 个答案:

答案 0 :(得分:0)

问题是你的类名不遵循Java的良好做法:类名以大写字母开头。 Drools似乎非常重视这一点:)

将您的班级名称更改为* P * rova​​,它应该可以正常工作。

编辑:忘了这个回复。我在测试这个场景时犯了一个错误。请参阅我的其他回复

希望它有所帮助,

答案 1 :(得分:0)

让我们重新开始吧。我设法通过在我的drl中导入一个不存在的类来重现错误消息。因此,请仔细检查.drl文件中的导入是否指向正确的'prova'类。还可以通过drools的引擎在运行时访问该类(该类必须位于类路径中)。

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

希望它有所帮助,

答案 2 :(得分:0)

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