You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@texera.apache.org by "AnzhiZhang (via GitHub)" <gi...@apache.org> on 2025/08/25 05:59:15 UTC
[I] `require = true` does not validate empty string in frontend [texera]
AnzhiZhang opened a new issue, #3692:
URL: https://github.com/apache/texera/issues/3692
## Problem
Currently, we have many operator descriptions using `@JsonProperty(required = true)` on string fields. For example, chart operators (see #3192).
https://github.com/apache/texera/blob/c7fcd9f4278f850e3c1456866ba6f25f85a8f489/core/workflow-operator/src/main/scala/edu/uci/ics/amber/operator/visualization/barChart/BarChartOpDesc.scala#L41-L70
For example, if we have this class.
```scala
import com.fasterxml.jackson.annotation.JsonProperty
class Test {
@JsonProperty(value = "test", required = true)
var test: String = ""
}
```
The JSON schema will be
```json
{
"$schema" : "http://json-schema.org/draft-07/schema#",
"type" : "object",
"additionalProperties" : false,
"properties" : {
"test" : {
"propertyOrder" : 1,
"type" : "string",
"title" : "Test"
}
},
"required" : [ "test" ]
}
```
We are using [Ajv](https://github.com/ajv-validator/ajv) in the frontend to validate JSON schema, if we test this schema in the frontend (a simple example).
```ts
import Ajv from "ajv";
const ajv = new Ajv({ allErrors: true, strict: false });
const schema = {
type: "object",
properties: {
test: {
type: "string",
},
},
required: ["test"],
};
const json = {
test: "",
};
// true
console.log(ajv.validate(schema, json));
const json2 = {};
// false
console.log(ajv.validate(schema, json2));
```
It only works for a real null property, not an empty string.
The debug information confirms this finding.
<img width="2360" height="1030" alt="Image" src="https://github.com/user-attachments/assets/9d7e1876-9dfe-40b2-862c-0dadc16fcab7" />
<img width="2384" height="812" alt="Image" src="https://github.com/user-attachments/assets/8e0f026c-37a7-4070-8516-347589559f86" />
## Solution
We will need to add `@NotNull` annotation from `javax.validation.constraints.NotNull` to introduce `"minLength" : 1,` requirement to the JSON Schema (https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423).
```java
import com.fasterxml.jackson.annotation.JsonProperty
import javax.validation.constraints.NotNull
class Test {
@JsonProperty(value = "test", required = true)
@NotNull(message = "test cannot be empty")
var test: String = ""
}
```
Will generate the schema.
```json
{
"$schema" : "http://json-schema.org/draft-07/schema#",
"type" : "object",
"additionalProperties" : false,
"properties" : {
"test" : {
"propertyOrder" : 1,
"type" : "string",
"minLength" : 1,
"title" : "Test"
}
},
"required" : [ "test" ]
}
```
To test it.
```ts
const schema2 = {
type: "object",
properties: {
test: {
type: "string",
minLength : 1,
},
},
required: ["test"],
};
// false
console.log(ajv.validate(schema2, json));
```
## Alternative Solutions
To validate "empty string" (in the context of Java empty string, which is 0 length) in Ajv, the only solution is `minLength`, a more detailed discussion can be found here (https://stackoverflow.com/a/47471462/19420247)
1. Use `javax.validation.constraints.Pattern` to validate by regex pattern, which also resolves the issue if the input string that all chars are spaces, but may require more performance and is not consistent with Java.
2. Catch error from backend. This is a workaround, as we are expecting to validate at the frontend. If we choose this solution, the validation status at the front will be valid at first, then turn to invalid. This will reflect on the Run button (flash).
## Related Issues
- #3656
- #3192
- https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@texera.apache.org.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] Require Attribute Name to be Not Blank [texera]
Posted by "AnzhiZhang (via GitHub)" <gi...@apache.org>.
AnzhiZhang commented on issue #3692:
URL: https://github.com/apache/texera/issues/3692#issuecomment-3230132435
<details>
<summary>Origin issue, for reference only, no need to read.</summary>
## Problem
Currently, we have many operator descriptions using `@JsonProperty(required = true)` on string fields. For example, chart operators (see #3192).
https://github.com/apache/texera/blob/c7fcd9f4278f850e3c1456866ba6f25f85a8f489/core/workflow-operator/src/main/scala/edu/uci/ics/amber/operator/visualization/barChart/BarChartOpDesc.scala#L41-L70
For example, if we have this class.
```scala
import com.fasterxml.jackson.annotation.JsonProperty
class Test {
@JsonProperty(value = "test", required = true)
var test: String = ""
}
```
The JSON schema will be
```json
{
"$schema" : "http://json-schema.org/draft-07/schema#",
"type" : "object",
"additionalProperties" : false,
"properties" : {
"test" : {
"propertyOrder" : 1,
"type" : "string",
"title" : "Test"
}
},
"required" : [ "test" ]
}
```
We are using [Ajv](https://github.com/ajv-validator/ajv) in the frontend to validate JSON schema, if we test this schema in the frontend (a simple example).
```ts
import Ajv from "ajv";
const ajv = new Ajv({ allErrors: true, strict: false });
const schema = {
type: "object",
properties: {
test: {
type: "string",
},
},
required: ["test"],
};
const json = {
test: "",
};
// true
console.log(ajv.validate(schema, json));
const json2 = {};
// false
console.log(ajv.validate(schema, json2));
```
It only works for a real null property, not an empty string.
The debug information confirms this finding.
<img width="2360" height="1030" alt="Image" src="https://github.com/user-attachments/assets/9d7e1876-9dfe-40b2-862c-0dadc16fcab7" />
<img width="2384" height="812" alt="Image" src="https://github.com/user-attachments/assets/8e0f026c-37a7-4070-8516-347589559f86" />
## Solution
We will need to add `@NotNull` annotation from `javax.validation.constraints.NotNull` to introduce `"minLength" : 1,` requirement to the JSON Schema (https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423).
```java
import com.fasterxml.jackson.annotation.JsonProperty
import javax.validation.constraints.NotNull
class Test {
@JsonProperty(value = "test", required = true)
@NotNull(message = "test cannot be empty")
var test: String = ""
}
```
Will generate the schema.
```json
{
"$schema" : "http://json-schema.org/draft-07/schema#",
"type" : "object",
"additionalProperties" : false,
"properties" : {
"test" : {
"propertyOrder" : 1,
"type" : "string",
"minLength" : 1,
"title" : "Test"
}
},
"required" : [ "test" ]
}
```
To test it.
```ts
const schema2 = {
type: "object",
properties: {
test: {
type: "string",
minLength : 1,
},
},
required: ["test"],
};
// false
console.log(ajv.validate(schema2, json));
```
## Alternative Solutions
To validate "empty string" (in the context of Java empty string, which is 0 length) in Ajv, the only solution is `minLength`, a more detailed discussion can be found here (https://stackoverflow.com/a/47471462/19420247)
1. Use `javax.validation.constraints.Pattern` to validate by regex pattern, which also resolves the issue if the input string that all chars are spaces, but may require more performance and is not consistent with Java.
2. Catch error from backend. This is a workaround, as we are expecting to validate at the frontend. If we choose this solution, the validation status at the front will be valid at first, then turn to invalid. This will reflect on the Run button (flash).
## Demo
This demo shows the effect of adding `@NotNull`. The bar chart operator is edited to have `@NotNull`. When adding the bar chart operator, the workflow is consistently invalid. However, without this requirement on the dot plot operator, the workflow changes to valid sometimes because these validations are passed due to empty string attributes (see debug screenshots above).
https://github.com/user-attachments/assets/067a7e84-b4e4-4a5c-b83a-b5a320914f6c
## Related Issues
- #3656
- #3192
- https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423
</details>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@texera.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] Require Attribute Name to be Not Blank [texera]
Posted by "AnzhiZhang (via GitHub)" <gi...@apache.org>.
AnzhiZhang commented on issue #3692:
URL: https://github.com/apache/texera/issues/3692#issuecomment-3230161406
As commented [here](https://github.com/apache/texera/pull/1277#pullrequestreview-719856905), we now have some load for us to maintain the JSON schema generator. [mbknor/mbknor-jackson-jsonSchema](https://github.com/mbknor/mbknor-jackson-jsonSchema) is not actively maintained. The last commit was 4 years ago, the last merged PR was in 2020, and the last maintainer involved issue was in 2021.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: dev-unsubscribe@texera.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [I] Require Attribute Name to be Not Blank [texera]
Posted by "chenlica (via GitHub)" <gi...@apache.org>.
chenlica closed issue #3692: Require Attribute Name to be Not Blank
URL: https://github.com/apache/texera/issues/3692
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@texera.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org