From 6b52068e80144ae0737f49ea90c00a9a138952af Mon Sep 17 00:00:00 2001 From: Jha-Shivam-602 Date: Sun, 8 Feb 2026 21:10:42 +0530 Subject: [PATCH] Enhance Owner List, Add Validation & Swagger UI --- pom.xml | 5 +++++ .../samples/petclinic/model/Person.java | 2 ++ .../samples/petclinic/owner/PetValidator.java | 17 +++++++++++++++- .../system/OpenApiConfiguration.java | 20 +++++++++++++++++++ .../templates/owners/ownersList.html | 4 ++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/springframework/samples/petclinic/system/OpenApiConfiguration.java diff --git a/pom.xml b/pom.xml index fb38cc3db..6636aa492 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,11 @@ ${webjars-font-awesome.version} runtime + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.6.0 + org.springframework.boot diff --git a/src/main/java/org/springframework/samples/petclinic/model/Person.java b/src/main/java/org/springframework/samples/petclinic/model/Person.java index 30b5829d8..331f2454d 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Person.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Person.java @@ -29,10 +29,12 @@ public class Person extends BaseEntity { @Column @NotBlank + @jakarta.validation.constraints.Pattern(regexp = "^[a-zA-Z\\s'-]+$", message = "must contain only letters, spaces, hyphens, or apostrophes") private String firstName; @Column @NotBlank + @jakarta.validation.constraints.Pattern(regexp = "^[a-zA-Z\\s'-]+$", message = "must contain only letters, spaces, hyphens, or apostrophes") private String lastName; public String getFirstName() { diff --git a/src/main/java/org/springframework/samples/petclinic/owner/PetValidator.java b/src/main/java/org/springframework/samples/petclinic/owner/PetValidator.java index dfe5304d5..4a57bb8df 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/PetValidator.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/PetValidator.java @@ -22,7 +22,8 @@ import org.springframework.validation.Validator; /** * Validator for Pet forms. *

- * We're not using Bean Validation annotations here because it is easier to define such + * We're not using Bean Validation annotations here because it is easier to + * define such * validation rule in Java. *

* @@ -38,9 +39,23 @@ public class PetValidator implements Validator { Pet pet = (Pet) obj; String name = pet.getName(); // name validation + if (!StringUtils.hasText(name)) { errors.rejectValue("name", REQUIRED, REQUIRED); } + // Edge Case: Check for leading/trailing spaces if trimmed but not null + else if (!name.equals(name.trim())) { + errors.rejectValue("name", "leadingTrailingSpace", "cannot start or end with spaces"); + } + // Edge Case: Max length + else if (name.length() > 30) { + errors.rejectValue("name", "maxLength", "must be 30 characters or less"); + } + // Edge Case: Symbols/Special Chars + else if (!name.matches("^[a-zA-Z0-9\\s'-]+$")) { + errors.rejectValue("name", "invalidCharacters", + "contains invalid characters (only letters, numbers, spaces, hyphens allowed)"); + } // type validation if (pet.isNew() && pet.getType() == null) { diff --git a/src/main/java/org/springframework/samples/petclinic/system/OpenApiConfiguration.java b/src/main/java/org/springframework/samples/petclinic/system/OpenApiConfiguration.java new file mode 100644 index 000000000..3b27e0eaa --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/system/OpenApiConfiguration.java @@ -0,0 +1,20 @@ +package org.springframework.samples.petclinic.system; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class OpenApiConfiguration { + + @Bean + public OpenAPI petClinicOpenAPI() { + return new OpenAPI().info(new Info().title("Spring PetClinic API") + .description("Spring PetClinic sample application") + .version("v0.0.1") + .license(new License().name("Apache 2.0").url("http://springdoc.org"))); + } + +} diff --git a/src/main/resources/templates/owners/ownersList.html b/src/main/resources/templates/owners/ownersList.html index 01223c1c5..adf430c8b 100644 --- a/src/main/resources/templates/owners/ownersList.html +++ b/src/main/resources/templates/owners/ownersList.html @@ -9,15 +9,18 @@ + + + @@ -25,6 +28,7 @@ +
ID Name Address City Telephone PetsPet Count