2013-09-09 4 views
0

Я использую Drools и Liferay, и я пытаюсь вставить в BD пользователя, когда правило было правдой, но Drools не позволяет мне импортировать пакет. У меня нет класса .drl, я передаю строку для запуска drools. Это мой код:Только тип может быть импортирован 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 == "[email protected]") 
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 код: пакет 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 (строка: 53): импортируется только тип. com.segmentationPortlet.controller.prova разрешает пакет ] [классификационная классификация функций (строка: 35): импортируется только тип. com.segmentationPortlet.controller.prova разрешает пакет ] [function getCustomAttributegetCustomAttribute (строка: 53): импортируется только тип. com.segmentationPortlet.controller.prova разрешает пакет ]

Любая идея, как я могу решить проблему?

спасибо.

ответ

0

Я решил эту проблему . этот код генерируется динамически и выполняется, тогда мне нужно создать новый проект, сделать .jar и перенести его в/tomcat/lib/ext, чтобы получить доступ к Drools.

0

Проблема в том, что имя вашего класса не соответствует хорошим практикам Java: имена классов начинаются с заглавной буквы. Drools, похоже, воспринимает это довольно серьезно :)

Измените название своего класса на * P * rova, и он должен работать нормально.

EDIT: Забудьте об этом ответе. Я ошибся при тестировании этого сценария. Смотрите другой мой ответ вместо

Надеются, что это помогает,

+0

Я проверяю импорт, и это правильно. попробуйте добавить класс в classpath: Нажмите в имени проекта, «Свойства» -> «Путь сборки Java» и в «Библиотеках» нажмите «Добавить папку класса» и выберите папку/src/com/cont ролик, в котором находится класс «Prova.java». Но когда я выполняю код, у меня такая же ошибка. И да, я использую Drools 5.5.0, но у меня нет этой ошибки, потому что код еще не выполнен. Я попытался поместить путь в Prova.java в classpath Windows, но он тоже не работает. Спасибо. – sandra

0

Давайте начнем снова. Мне удалось воспроизвести сообщение об ошибке, импортировав в мой drl. Поэтому, пожалуйста, дважды проверьте, что импорт в ваш .drl-файл указывает на правильный класс «prova». Также сделайте, чтобы класс был доступен во время выполнения движком drools (класс должен быть в пути к классам).

Кстати, какую версию слюни вы используете? Согласно 5.5.0, правая часть вашего второго правила должны терпеть неудачу во время компиляции со следующим сообщением: «Ошибка Правила компиляции Локальной переменной р не может быть инициализирована»

Надеется, что это помогает,

+0

Я проверяю импорт, и это правильно. Я пытаюсь добавить класс в classpath, делая это: Нажмите в имени проекта, «Свойства» -> «Путь сборки Java» и в «Библиотеках» нажмите «Добавить папку класса» и выберите папку/src/com/controller, которая это где класс «Prova.java». Но когда я выполняю код, у меня такая же ошибка. И да, я использую Drools 5.5.0, но у меня нет этой ошибки, потому что код еще не выполнен. Спасибо. – sandra