8

インジェクションによって統合された kie (drools 6) を使用して Web (spring-mvc) アプリケーションを構築しようとしています。kie ワークベンチを使用してワークフローを作成し、コンパイルしてデプロイしました。プロジェクトの pom.xml にこのアーティファクトの参照を追加し、このブログ投稿に従ってローカルの kie-workbench リポジトリを追加しましたが、正常に動作しています (私の maven/spring プロジェクトの依存関係としてアーティファクトをプルしています)。私がやろうとしているのは、次のスニペットを使用して、サービスの 1 つに kiesession を依存関係として挿入することです -

@Service
public class TniServiceImpl implements TniService {

@Inject
@KSession("tniSession")
private KieSession tniSession;
...
}

私の root-context.xml では、xsd への参照と共に kie 名前空間も追加しました。org.kie.spring.KModuleBeanFactoryPostProcessor と drools のドキュメントを追加しました。KSession スキャンとインジェクションで CDI インジェクションを機能させようとしています (@Inject を使用して、同じプロジェクト内の他のコンポーネントで既に機能しています)。これまでのところ、「依存関係のタイプ [org.kie.api.runtime.KieSession] の適格な Bean が見つかりません」というエラーが常に発生します。春は利用可能な kie モジュールとセッションをスキャンできないようです。次のヘルプが必要 -

  1. CDI inject は本当に spring でサポートされていますか? ここに記載されているように、kmodules と kession を明示的に構成する必要がありますか?
  2. このスキャンとインジェクションを機能させるための何かが欠けていますか?

私の環境は次のとおりです-

  1. spring 3.2.6-RELEASE (webmvc およびその他のコンポーネントを含む)
  2. kie-api-6.0.1.FINAL
  3. kie-spring-6.0.1.FINAL
  4. kie-internal-6.0.1.FINAL

私はすでにリンクをたどりましたが、運がありません(ほとんどの場合、彼らは私がしていることをしようとはしていません)-

  1. Drools/KIE Workbench アーティファクトをリポジトリから直接ロードする
  2. Drools 6 KIE JAR のコードへのロードが失敗するのはなぜですか?

ここで欠落している可能性のある部分について誰かが私を案内してくれるか、または春の設定ファイルですべての kmodules/ksessions を明示的に定義する以外に選択肢がないかどうかを教えていただければ幸いです。

4

4 に答える 4

4

私は同じ問題を抱えていて、ここで解決策を見つけました: http://drools.46999.n3.nabble.com/Spring-4-0-amp-Drools-6-0-1-Integration-issue-td4028052.html

基本的に、kieSession の代わりに ApplicationContext を注入し、xml Bean を手動で取得する必要があります。

TniServiceImpl.java

@Service
public class TniServiceImpl implements TniService {

  @Inject 
  ApplicationContext context; 

  KieSession kieSession;

  @PostConstruct 
  public void postConstruct(){ 
    kieSession = (KieSession) context.getBean("ksession1"); 
  }
  ...
}

root-context.xml

   <kie:kmodule id="kmodule1">
     <kie:kbase name="kbase1">
        <kie:ksession name="ksession1" />
     </kie:kbase>
  </kie:kmodule>
  <bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor" />

お役に立てれば。

アップデート:

これを達成する別の方法は、xml を同一に保ち、KieSession を注入しようとする代わりに、KieBase を注入することです。次に、KieBase のインスタンスを使用して、新しい KieSession を作成します。

@Service
public class TniServiceImpl implements TniService {

    @Autowired
    private KieBase kbase;

    /* inside some method */
    @RequestMapping(method=RequestMethod.GET)
    public @ResponseBody Data getData() {
        KieSession ksession = kbase.newKieSession();
            ...
    }
}
于 2014-03-13T11:30:35.640 に答える