Convert POJOs to Zod schemas. Uses JSR-380 (bean validation) annotations to specify the constraints.
Write your schemas once, and use them for both frontend and backend validation.
public class Person {
@NotEmpty(message = "must not be empty")
public String givenName;
@NotEmpty
public String surname;
@Positive(message = "must be positive")
public int age;
@Email(message = "must be a valid email")
public String email;
@NotNull
public AccountType accountType;
}
enum AccountType {
PREMIUM,
STANDARD,
BASIC,
}
Running the java-to-zod plugin will give you:
const PersonSchema = zod.object({
givenName: zod.string().min(1, { message: 'must not be empty' }),
surname: zod.string().min(1),
age: zod.number().int().positive({ message: 'must be positive' }),
email: zod.string().email({ message: 'must be a valid email' }).optional().nullable(),
accountType: zod.enum(['PREMIUM', 'STANDARD', 'BASIC']),
});
Goes well with typescript-generator, and shares many of the same configuration options for scanning source classes.
<plugin>
<groupId>sh.ivan</groupId>
<artifactId>java-to-zod-maven-plugin</artifactId>
<version>VERSION</version>
<configuration>
<jsonLibrary>jackson2</jsonLibrary>
<outputFile>${project.basedir}/../frontend/generated-schemas.js</outputFile>
<classPatterns>
<classPattern>sh.ivan.pojo.**</classPattern>
</classPatterns>
</configuration>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>
See plugin configuration docs for all configuration properties.
- AssertFalse
- AssertTrue
- DecimalMax - Not yet implemented
- DecimalMin - Not yet implemented
- Digits - Not yet implemented
- Future - Not yet implemented
- FutureOrPresent - Not yet implemented
- Max
- Min
- Negative
- NegativeOrZero
- NotBlank
- NotEmpty
- NotNull
- Null - Not yet implemented
- Past - Not yet implemented
- PastOrPresent - Not yet implemented
- Pattern
- No transformation is made to the regex pattern string. Keep in mind that the Java and
JavaScript regex engines are not identical. The only flags supported are:
- CASE_INSENSITIVE (
/i
) - MULTILINE (
/m
) - DOTALL (
/s
)
- CASE_INSENSITIVE (
- All other flags are ignored
- No transformation is made to the regex pattern string. Keep in mind that the Java and
JavaScript regex engines are not identical. The only flags supported are:
- Positive
- PositiveOrZero
- Size