JAXB Errors in process models

For a while now we are getting JAXB errors in several different process models with the following error or similar to this error. Difficulty is that even if it will return the same error; where the error happens might be in different parts of the same process model (see below), but mostly it will break on the start process nodes from what I can see.

We tried removing special characters or smileys from any fields that are passed to the process with clean(), since we feel like this might be causing the errors, but so far no luck yet. Any help would be appreciated!
*Please note that I have redacted a large piece of the errortext for privacy purposes. Including parts that might contain the possibly disallowed characters/smileys etc.
In this specific example I think it might have been the character ü, but we have found that it is also possible that the character that will break the process is only visible in our main database (not in the MariaDB) as a blank space which makes finding the issue near impossible for a lot of cases.

JAXB failure trying to convert value ProcessInfo{{pp={id=2474165, name=SCD Generic Create Transacties 22024049276, priority=1, initiator=UserRefImpl{id=xxx, uuid=null}, startTime=2024-06-14 14:59:23.91, deadline=null, timeZone=Europe/Amsterdam, starred=false, parentId=null, parentName=, execId=2, status=0, endTime=null}, pm={id=877, uuid=0006eab2-dc07-8000-3aec-7f0000014e7a, name=SCD Generic Create Transacties, description=, version=7.0, creator=UserRefImpl{id=adm.deployment, uuid=null}, timeZone=Europe/Amsterdam, starred=false, parentId=null, parentName=}, pv={TypedValue[it=3,v=archivedDossier]=TypedValue[it=4612,v=<null>], TypedValue[it=3,v=archivedTransacties]=TypedValue[it=4541,v=<null>], TypedValue[it=3,v=dossier]=TypedValue[it=3880,v={TypedValue[it=3,v=b1eb750b-11cb-43d6-8c84-e6dc3ad218e3]=TypedValue[it=3,v=22024049276], TypedValue[it=3,v=8d379549-6797-434f-a877-

...
...

52a844984530]=TypedValue[it=3606,v= TypedValue[it=3,v=7dc0de83-596a-4372-add8-64c6c36e3380]=TypedValue[it=57,v=<null>], TypedValue[it=3,v=a2ca2f28-a7e3-4119-8bfa-b4776cd63395]=TypedValue[it=3,v=xxx], TypedValue[it=3,v=0f10b481-e93a-48d3-b785-2e41bb618fd2]=TypedValue[it=3,v=J]}], TypedValue[it=3,v=errorText]=TypedValue[it=3,v=], TypedValue[it=3,v=parentObjectName]=TypedValue[it=3,v=DEC Send Email From Module - 22024049276], TypedValue[it=3,v=runSyncAsSubprocessBool]=TypedValue[it=26,v=<null>], TypedValue[it=3,v=standardChecks]=TypedValue[it=3,v=], TypedValue[it=3,v=transacties]=TypedValue[it=4085,v={{TypedValue[it=3,v=e56a58c2-d951-4f35-bd2c-d8ee9e9829ad]=TypedValue[it=3,v=TRN#BRIEF]}}], TypedValue[it=3,v=writeErrorBool]=TypedValue[it=26,v=<null>]}}} to Appian type ProcessInfo (id=2728) 

  Discussion posts and replies are publicly visible

  • I think that is not related with special characters but with the structure of the data. JAXB is a library designed for binding to XML your data structures.

    If the strcuture of your data does not fit with overlying xsd schema, you will receive this kind of errors (JAXB Exception)

  • Thank you for your answer David! How would you go for resolving errors like this? Since the processes will break at different nodes and for dictionaries with different data types might there be an underlying problem with the Record Types we provide as input?
    For this example the input for the node was a dictionary with data for 2 record types and pp!name.
    From what I can see all the errors are in nodes where a dictionary is the input data for a startprocess.The data that goes in the dictionary are data types for which you would not expect errors like this e.g. Record Types, text, boolean etc.

  • We have found a solution for this error, it comes down to removing unprintable items before passing them to the start proces nodes.

    The function we use to solve this problem (I added the rules we use here below):
    rule!DEC_RemoveSmileys:
    a!forEach(
      items: ri!rappellen,
      expression: a!update(
        fv!item,
        "RAPL_OMSCHRIJVING",
        a!localVariables(
          local!cleaned: rule!DCO_Clean(
            inputData: fv!item["RAPL_OMSCHRIJVING"],
            specialCharMaps: { a!map(char: "€", string: " [#EURO#] ") }
          ),
          if(
            and(
              not(rule!DCO_IsVoid(local!cleaned)),
              find("[#EURO#]", local!cleaned) > 1
            ),
            substitute(local!cleaned, " [#EURO#] ", "€"),
            local!cleaned
          )
        )
      )
    ),
    rappellen: Text (array)
    
    rule!DCO_Clean: 
    if(
      rule!DCO_IsVoid(ri!inputData),
      null,
      a!flatten(
        a!forEach(
          items: ri!inputData,
          expression: if(
            rule!DCO_IsVoid(ri!specialCharMaps),
            clean(fv!item),
            clean(
              reduce(
                rule!DCO_CleanReduceSubFunction,
                fv!item,
                ri!specialCharMaps
              )
            )
          )
        )
      )
    ),
    inputData: Text (Array),
    specialCharMaps: Map (Array)
    __
    rule!DCO_CleanReduceSubFunction: 
    if(
      rule!DCO_IsVoid(ri!string),
      "",
      substitute(
        ri!string,
        ri!specialCharMap["char"],
        ri!specialCharMap["string"]
      )
    ),
    String: Text,
    sepcialCharMap: Map
    __
    rule!DCO_IsVoid: a!match(
      value: runtimetypeof(ri!value),
      whenTrue: a!isNullOrEmpty(ri!value),
      then: true,
      /* Strings */
      whenTrue: fv!value = 'type!{http://www.appian.com/ae/types/2009}Text',
      /* Ignore white space */
      then: len(trim(ri!value)) = 0,
      /* List of Variant */
      whenTrue: fv!value = 'type!{http://www.appian.com/ae/types/2009}Variant?list',
      then: all(a!isNullOrEmpty(_), a!flatten(ri!value)),
      /* Lists */
      /* Try to take first item in list and cast it to a list of itself */
      /* then compare its datatype to the incoming data type */
      whenTrue: fv!value = runtimetypeof(
        cast(
          runtimetypeof({ index(ri!value, 1, null) }),
          ri!value
        )
      ),
      /* Flatten takes care of lists in lists in lists in ... */
      /* List has zero non-null items, length() already ignores null values*/
      then: length(a!flatten(ri!value)) = 0,
      /* DataSubsets or Maps returned by queryRecordType */
      whenTrue: or(
        fv!value = 'type!{http://www.appian.com/ae/types/2009}DataSubset',
        and(
          fv!value = 'type!{http://www.appian.com/ae/types/2009}Map',
          contains(a!keys(ri!value), "data"),
          
        )
      ),
      then: a!isNullOrEmpty(ri!value.data),
      /* Empty map without any keys and values */
      whentrue: fv!value = 'type!{http://www.appian.com/ae/types/2009}Map',
      then: or(
        length(a!keys(ri!value)) = 0,
        
        /*  The commented line below will make a map filled with keys but no values seen as void  */
        /*all(a!isNullOrEmpty(_), index(ri!value, a!keys(ri!value), null))*/
        
      ),
      default: false
    )
    Value: Any type