elsa-workflows / elsa-workflows/elsa-core

[BUG] Variable evaluation does not use custom JsonConverters that were registered

Open
#7,194 0 comments 0 reactions 0 assignees View on GitHub
triaged
Dominant language
C#
Stars
7.9k
Forks
1.5k
Avg merge
15h 22m
Merged PRs (30d)
114

Description

## Description
If you attempt to use a custom type as a variable in the workflow will blow up during deserialization.

## Steps to Reproduce
Create a new type, like a string primitive and use it as a parameter. Try to run the workflow and it will throw an exception

1. **Detailed Steps**: Provide a step-by-step description of what leads to the bug. Be as specific as possible.

1. Create a custom type that requires a custom json converter to load
1. Add that type as an Input
1. Run the workflow

2. **Code Snippets**:

**Type**:
```cs
public struct AbsolutePath
{
public string Value { get; }

public AbsolutePath(string value)
{
Value = value;
}
}
```
**Conveter**
```cs
public class AbsolutePathJsonConverter : JsonConverter
{
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.Value);

public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> new AbsolutePath(reader.GetString());
}
````

**Register the converter**

```cs
public class CustomSerializationOptionsConfiguratorBase : SerializationOptionsConfiguratorBase
{
{
public override void Configure(JsonSerializerOptions options)
{
options.Converters.Add(new AbsolutePathJsonConverter());
}
}
```

**Add it to elsa**
```cs
public class MyFeature : FeatureBase
{
public override void Apply()
{
Services.AddSerializationOptionsConfigurator();
}
}
```

4. **Reproduction Rate**: 100% of the time

## Expected Behavior
The type should be deserailized using the registered converters

## Actual Behavior
The `VariableExtensions` class has a hard coded serializer option that the users are unable to modify. It uses the default converter which fails.

## Log Output
**CallStack:**
```log
at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.Converters.NullableConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, Nullable`1& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, T& value, JsonSerializerOptions options, ReadStack& state)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.Deserialize(Utf8JsonReader& reader, ReadStack& state)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsObject(Utf8JsonReader& reader, ReadStack& state)
at System.Text.Json.JsonSerializer.ReadFromSpanAsObject(ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
at System.Text.Json.JsonSerializer.ReadFromSpanAsObject(ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
at System.Text.Json.JsonSerializer.Deserialize(String json, Type returnType, JsonSerializerOptions options)
at Elsa.Expressions.Helpers.ObjectConverter.ConvertTo(Object value, Type targetType, ObjectConverterOptions converterOptions)"
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.