diff --git a/src/main/java/de/schulung/quarkus/recipes/Recipe.java b/src/main/java/de/schulung/quarkus/recipes/Recipe.java index 13058d3..e016622 100644 --- a/src/main/java/de/schulung/quarkus/recipes/Recipe.java +++ b/src/main/java/de/schulung/quarkus/recipes/Recipe.java @@ -4,7 +4,6 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; import lombok.Getter; import lombok.Setter; @@ -30,8 +29,7 @@ public class Recipe { /** * URL of the recipe image, absolute or relative. */ - @Size(max = 255) - @Pattern(regexp = "^(/|https?://).+") + @ValidUrl private String img; /** * The number of servings. diff --git a/src/main/java/de/schulung/quarkus/recipes/ValidUrl.java b/src/main/java/de/schulung/quarkus/recipes/ValidUrl.java new file mode 100644 index 0000000..8e89fa8 --- /dev/null +++ b/src/main/java/de/schulung/quarkus/recipes/ValidUrl.java @@ -0,0 +1,32 @@ +package de.schulung.quarkus.recipes; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import jakarta.validation.ReportAsSingleViolation; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.PARAMETER, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.TYPE_USE +}) +@Documented +@Constraint(validatedBy = {}) +@Size(max = 255) +@Pattern(regexp = "^(/|https?://).+") +@ReportAsSingleViolation +public @interface ValidUrl { + + String message() default "must be a valid image URL (absolute or starting with /) with at most 255 characters"; + + Class[] groups() default {}; + + Class[] payload() default {}; +}