cancel
Showing results for 
Search instead for 
Did you mean: 

Activiti 5.18 - Extending the REST API

soaguy
Champ in-the-making
Champ in-the-making
Hello all,
            I am trying to create a custom rest service that utilizes the engine api. I created a maven spring project and coded the RestController. I am not sure where I should place this class for the DispatcherServlet to route to the 'dsw/sendResponse' endpoint. Do I need to make any changes to activiti-rest web.xml or any configuration file?

——– RestController —–

package org.activiti.rest.service.api.dsw;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.Execution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CustomRestController {

   @Autowired
   private RuntimeService runtimeService;

   @RequestMapping(value = "/dsw/sendResponse", method = RequestMethod.PUT, produces = "application/json")
   public MessageCorrelationResponse correlate(@RequestBody MessageCorrelationRequest messageRequest,
         HttpServletRequest request) {
      MessageCorrelationResponse messageResponse = new MessageCorrelationResponse();

      if (checkValidString(messageRequest.getMessageName()) && checkValidString(messageRequest.getCorrelationKey())
            && checkValidString(messageRequest.correlationKeyValue)
            && checkValidString(messageRequest.getMessagePayload())) {

         String messageName = messageRequest.getMessageName();
         // Locate the execution using the correlation
         Execution execution = runtimeService.createExecutionQuery().messageEventSubscriptionName(messageName)
               .variableValueEquals(messageRequest.getCorrelationKey(), messageRequest.correlationKeyValue)
               .singleResult();
         // Set message into map
         Map<String, Object> variableMap = new HashMap<String, Object>();
         variableMap.put("_MessageName", messageName);
         variableMap.put("_MessageContent", messageRequest.getMessagePayload());

         runtimeService.messageEventReceived(messageName, execution.getId(), variableMap);

         messageResponse.setResult("success");
      } else
         messageResponse.setResult("Invalid inputs");

      return messageResponse;

   }

   private boolean checkValidString(String str) {
      if (str != null && !str.isEmpty())
         return true;
      return false;

   }

}


—— activiti-rest webapp web.xml —
<blockcode>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">

    <display-name>Activiti REST</display-name>
    <!– All the Servlets and Filters are configured by this ServletContextListener : –>
    <listener>
        <listener-class>org.activiti.rest.servlet.WebConfigurer</listener-class>
    </listener>
</web-app>
</blockcode>
2 REPLIES 2

trademak
Star Contributor
Star Contributor
By default the org.activiti.rest.service.api package is scanned by Spring, so if your RestController is in this package or a sub package then it should be ok.

Best regards,

soaguy
Champ in-the-making
Champ in-the-making
Thanks Tijs. It works fine.