【问题标题】:activiti - Assigning a task to a group or a useractiviti - 将任务分配给组或用户
【发布时间】:2018-01-24 20:44:19
【问题描述】:

我在弄清楚如何根据他们在组/人员选择器中选择的值将简单任务分配给一个人一个组时遇到了一些麻烦。

因此,在我的用户界面中,用户可以使用相关的人员/组选择器控件选择人员

使用 activiti 分配属性,我将 Assignee 设置为 ${selectedPerson} 并将 Candidate Groups 设置为 ${selectedGroup}。这些变量与上面提到的选取器控件的值有关:

总体目标是用户应该能够将任务分配给一个人或一个组,但是上面的设计存在以下问题:

  • 当用户选择组时,任务成功分配给组,推测Assignee值可以为空。
  • 但是,当用户选择一个人而不是一个组时,Activiti 会抛出以下异常,因为它需要一个组;

org.activiti.engine.ActivitiIllegalArgumentException: Expression did 不解析为字符串或字符串集合

这样做的正确方法是什么?


完整的堆栈跟踪

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.activiti.engine.ActivitiIllegalArgumentException: Expression did not resolve to a string or collection of strings
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:97)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:149)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    com.activiti.security.CustomStatelessCSRFFilter.doFilterInternal(CustomStatelessCSRFFilter.java:68)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

【问题讨论】:

  • 你能上传完整的堆栈跟踪吗?
  • @AbbasKararawala 当然,检查我的最新编辑 :)

标签: groovy activiti bpmn alfresco-enterprise


【解决方案1】:

这是因为 Activiti 接受候选组的 ID 作为字符串或逗号分隔的字符串值。但是表单元素(如您所选择的)将所选组的组 ID 存储为 Long,因此是 IllegalArgumentException。尝试在用户选择后将变量存储为字符串,然后将此字符串作为候选组传递。

只有当${selectedPerson}${selectedGroup} 都具有非空值时,您使用的方法才会满足。

或者,您可以在要分配的任务上创建一个任务侦听器并执行逻辑。

类似:

public class CustomTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
    // get required variables
        String selectedPerson = (String) delegateTask.getVariable("selectedPerson");
        String selectedGroup = (String) delegateTask.getVariable("selectedGroup");
    // check for the condition
        if (null != selectedPerson && !selectedPerson.isEmpty()) {
    // set values
            delegateTask.setAssignee(selectedPerson);
        } else {
            delegateTask.addCandidateGroup(selectedGroup);
        }
    }
}

【讨论】:

  • 谢谢阿巴斯,我现在试试
  • 我认为这可能有效,但是如果我不为 ${selectedPerson} - Unknown property used in expression: ${selectedPerson} 提供字符串,我仍然会收到错误消息。我的印象是 Assignee 字段可以为空?
  • 您想要只受让人还是只想要候选组?还是两者同时?
  • 我需要或者。 UI 的问题在于它无法检查其中一个是否为空,即我们无法为动态赋值编写表达式。主要用例是如果填充了组选择器,我需要分配给组,如果填充了人员选择器,则分配给特定用户。现在它迫使我为两者设置一个结果,但当其中一个为空时失败
  • 感谢 Abbas,我不熟悉任务监听器,也无法访问 spring bean 定义等,这可以从设计器的流程实例中设置吗?
【解决方案2】:

如果您想将任务分配给用户或组

,您不能同时将两个受让人作为受让人和候选组

然后使用 Candidate Users 作为接受用户数组的受让人,如果您的第一个条件需要 true,则将变量设置为数组,然后将该用户添加到 array else 迭代组成员并将所有组成员添加数组,并将此数组变量作为受让人传递给 Candidate Users

【讨论】:

猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多