Azure / Azure/azure-functions-java-worker

Inconsistent behavior between OutputBinding<String> and OutputBinding<List<String>>

Open
#343 1 comment 0 reactions 1 assignee Claimed by @shreyas-gopalakrishna View on GitHub
area:java-functions needs-investigation reviewed
Dominant language
Java
Stars
103
Forks
74
Avg merge
4d 8h
Merged PRs (30d)
2

Description

The following code results in 2 rows in the cosmos DB

```Java
@FunctionName("CosmosDBTriggerJava1")
public void run(
@CosmosDBTrigger(
name = "items",
databaseName = "db1",
collectionName = "col3",
leaseCollectionName="leases",
connectionStringSetting = "juzhucos_DOCUMENTDB",
createLeaseCollectionIfNotExists = true
)
Object[] items,
@CosmosDBOutput(name = "database",
databaseName = "db1",
collectionName = "col2",
connectionStringSetting = "juzhucos_DOCUMENTDB")
OutputBinding outputItem, //this line caused error. It works with OutputBinding> and OutputBinding
final ExecutionContext context
) {
outputItem.setValue("[{\"name\":\"value 0\"},{\"name\":\"value 1\"}]");
}

```

While the following code results in error

```Java
@FunctionName("CosmosDBTriggerJava")
public void run(
@CosmosDBTrigger(
name = "items",
databaseName = "db1",
collectionName = "col1",
leaseCollectionName="leases",
connectionStringSetting = "juzhucos_DOCUMENTDB",
createLeaseCollectionIfNotExists = true
)
Object[] input,
@CosmosDBOutput(name = "database",
databaseName = "db1",
collectionName = "col2",
connectionStringSetting = "juzhucos_DOCUMENTDB")
OutputBinding> outputItem,
final ExecutionContext context
) {
List items = new ArrayList();

for (int i = 0; i < 2; i ++) {
items.add("{\"name\":\"value 0\"}");
}

outputItem.setValue(items);
}

```

```
[1/19/2020 8:47:13 AM] Executed 'Functions.CosmosDBTriggerJava' (Failed, Id=8e0edee5-49f5-4afc-82ff-fde57a43b67b)
[1/19/2020 8:47:13 AM] System.Private.CoreLib: Exception while executing function: Functions.CosmosDBTriggerJava. Microsoft.Azure.DocumentDB.Core: Value cannot be null.
[1/19/2020 8:47:13 AM] Parameter name: document.
```

This is because the first one is serialized to an array of 2 JSON objects, when doing RPC from the Java worker to the function host.
```Java
[{"name":"value 0"},{"name":"value 1"}]
```
While the later one is serialized to an array of 2 strings
```Java
["{\"name\":\"value 0\"}","{\"name\":\"value 1\"}"]
```

Can we make the later one support adding JSON string objects to the list, since the first one supports that.

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.