2017-09-13 82 views
0

我有一個這樣的對象:與JAXB KieServicesClient創建XML失敗(KIE 6.5.0)

@XmlRootElement(name="com.Operation") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Operation implements java.io.Serializable 
{ 

    static final long serialVersionUID = 1L; 

    @org.kie.api.definition.type.Label("systemCode") 
    @XmlElement 
    private int systemCode; 
    [...] 

當我馬歇爾這與以下似乎代碼手動它工作得很好:

[...] 
JAXBContext jaxbContext = 
DroolsJaxbHelperProviderImpl.createDroolsJaxbContext(classNames, null); 
Marshaller marshaller = jaxbContext.createMarshaller(); 
StringWriter xml = new StringWriter(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(object, System.out); 

因此,控制檯打印:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <com.Operation> 
    <systemCode>1</systemCode> 
    [...] 

但是,當我使用鼓勵的KieServerClient代碼,我得到一個錯誤:

org.kie.server.client.KieServicesException: Error while serializing request data! 
at org.kie.server.client.impl.AbstractKieServicesClientImpl.serialize(AbstractKieServicesClientImpl.java:514) 
at org.kie.server.client.impl.AbstractKieServicesClientImpl.makeHttpPostRequestAndCreateServiceResponse(AbstractKieServicesClientImpl.java:234) 
at org.kie.server.client.impl.RuleServicesClientImpl.executeCommandsWithResults(RuleServicesClientImpl.java:72) 
[...] 
Caused by: javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.SAXException2: class com.Operation ni ninguna de sus superclases se conocen en este contexto. 

(的是西班牙語,但我猜的錯誤是很容易的翻譯)

我的JAXB使用與KieServerClient的代碼片段:

KieCommands commandsFactory = KieServices.Factory.get().getCommands(); 

List<Command<?>> cmds = new ArrayList<Command<?>>(); 
BatchExecutionCommand command = commandsFactory.newBatchExecution(cmds, SESSION_STATEFUL); 

Command<?> insertObjectCommand = null; 
insertObjectCommand = commandsFactory.newInsert(operation, operation.getClass().getName(), false, null); 
cmds.add(insertObjectCommand); 
[...] 
KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(KieServer.urlKieServer, 
         KieServer.name, 
         KieServer.password); 
config.setMarshallingFormat(MarshallingFormat.JAXB); 
KieServicesClient client = KieServicesFactory.newKieServicesClient(config); 
RuleServicesClient rulesClient = client.getServicesClient(RuleServicesClient.class); 

ServiceResponse<ExecutionResults> response = rulesClient.executeCommandsWithResults("instances/"+containerName, command); 

什麼任何想法我我做錯了,爲什麼一個編組工作,但另一個不工作?

除了POJO之外,我目前還沒有maven下的這個項目,因爲我想知道我實際需要什麼jar來讓這些項目工作,而且maven中有很多依賴關係會自動解決,我基本上不知道什麼是什麼我需要(我的.m2滿了下載的罐子,我不知道)。 解決之後,我會將該項目轉換爲maven。

受累庫是:

  • droolsjbpm-integration-distribution-6.5.0.Final
  • droolsjbpm-tools-distribution-6.5.0.Final
  • HttpClient的-4.5.3
  • 的HttpCore-4.4.6
  • javax.ws.rs-API-2.0
  • JAXB-XJC-2.3.0
  • JMS-1。 1
  • kie-remote-client-6.5.0.Final
  • kie-remote-common-6.5.0.Final
  • kie-remote-jaxb-6.5.0.Final
  • 紀伊 - 服務器api-6.5.0.Final
  • kie-server-client-6.5.0.Final
  • optaplanner-core-6.5.0.Final

環境: - 的JBoss Developer Studio中10.4 - Wildfly 10.1PS:我已經能夠通過REST連接到KieServer,但它是與不鼓勵的代碼,可能是因爲(我猜,nobody has ever answered me)我沒有得到我想要的響應。

回答

1

所以我得到了答案多虧了一些指引我對中央企業RedHat的網頁遭遇:FIRING RULES USING KIE SERVER JAVA CLIENT API

鍵。在此情況下被添加類的紀伊客戶端的配置選項。使用Drools/Kie workbench 6.5.0時,以下代碼適用於通過REST與KIE服務器連接。 命令是一個有效的BatchExecutionCommand:

KieServicesConfiguration config = KieServicesFactory. 
       newRestConfiguration(KieServer.urlKieServer, 
         KieServer.name, 
         KieServer.password); 
config.setMarshallingFormat(MarshallingFormat.JAXB); 
config.setTimeout(3000L); //optional 
Set<Class<?>> allClasses = new HashSet<Class<?>>(); 
allClasses.add(YOURCLASS.class); 
config.addExtraClasses(allClasses); 

KieServicesClient client = KieServicesFactory.newKieServicesClient(config); 
RuleServicesClient rulesClient = client.getServicesClient(RuleServicesClient.class); 

ServiceResponse<ExecutionResults> response = rulesClient.executeCommandsWithResults(containerName, command); 

希望它可以幫助別人。

+0

我在github上有一個示例項目[link](https://github.com/eggsandbutter/kieservices)。 – Ruurd

+0

使用帶配置的KieServicesClient進行連接是最好的選擇。在版本7中都是一樣的,只是遠程庫中的一些代碼被移動到kie-server-client api,因爲Workbench沒有從版本7的內部服務器。 – zhrist

+0

感謝您的評論和確認!我需要儘快切換到版本7.去年Drools發展非常迅速。 – Ruurd