Ash
Ash

Reputation: 11

@Pattern Hibernate validation

public class DependentDto { private UUID id; @JsonIgnoreProperties(value = {"dateOfBirth", "age", "maritalStatus", "bloodGroup", "religion", "aadharNumber", "panCardNumber", "uanNumber", "passportNumber", "permanentAddress", "communicationAddress", "guardianName","nextOfKin","nextOfKinContactNumber","skillSet","employeeDto"}) private PersonalInformationDto personalInformationDto; @NotNull(message = "Name can not be null") private String name; @NotNull(message = "Relation can not be null") private String relation; @NotNull(message = "Date Of Birth Date cannot be null") @Pattern(regexp = "^\d{4}-\d{2}-\d{2}$", message = "Invalid date format. Please use the format yyyy-MM-dd (e.g., 2007-12-03).") private String dateOfBirth; @Pattern(regexp = "^\+(?:[0-9] ?){6,14}[0-9]$", message = "Invalid phone number format") private String contactNumber; }

This is my DTO class. I have added few pattern validation. When I test this in postman, for wrong pattern I get a very long error message as shown below. Is there a simple way to just show "Invalid date format. Please use the format yyyy-MM-dd (e.g., 2007-12-03).") instead of the entire message like below

{ "timestamp": "2024-01-23T10:32:04.470+00:00", "path": "/dependents", "status": 400, "error": "Bad Request", "message": "Validation failed for argument at index 0 in method: public reactor.core.publisher.Mono<com.frestonanalytics.msl.staffalyze.dto.DependentDto> com.frestonanalytics.msl.staffalyze.controller.DependentController.createDependent(com.frestonanalytics.msl.staffalyze.dto.DependentDto,org.springframework.web.server.ServerWebExchange), with 1 error(s): [Field error in object 'dependentDto' on field 'dateOfBirth': rejected value [1990-07-]; codes [Pattern.dependentDto.dateOfBirth,Pattern.dateOfBirth,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dependentDto.dateOfBirth,dateOfBirth]; arguments []; default message [dateOfBirth],[Ljavax.validation.constraints.Pattern$Flag;@b9d7349a,^\d{4}-\d{2}-\d{2}$]; default message [Your custom error message for dateOfBirth pattern mismatch]] ", "requestId": "53206fd4-2", "errors": [ { "codes": [ "Pattern.dependentDto.dateOfBirth", "Pattern.dateOfBirth", "Pattern.java.lang.String", "Pattern" ], "arguments": [ { "codes": [ "dependentDto.dateOfBirth", "dateOfBirth" ], "arguments": null, "defaultMessage": "dateOfBirth", "code": "dateOfBirth" }, [], { "codes": [ "^\d{4}-\d{2}-\d{2}$" ], "arguments": null, "defaultMessage": "^\d{4}-\d{2}-\d{2}$" } ], "defaultMessage": "Your custom error message for dateOfBirth pattern mismatch", "objectName": "dependentDto", "field": "dateOfBirth", "rejectedValue": "1990-07-", "bindingFailure": false, "code": "Pattern" } ] }

Tried ValidationMessages.properties but dint work

Upvotes: 0

Views: 28

Answers (1)

Ash
Ash

Reputation: 11

I found the required customisation

In Global Exception Handler class, I added a handler shown below

@ExceptionHandler(WebExchangeBindException.class) public Mono<ResponseEntity<Map<String, Object>>> handleValidationException(WebExchangeBindException ex, ServerWebExchange exchange) { Map<String, Object> errorResponse = new LinkedHashMap<>(); errorResponse.put("timestamp", Instant.now()); errorResponse.put("path", exchange.getRequest().getPath().value()); errorResponse.put("status", ex.getRawStatusCode()); errorResponse.put("error", ex.getStatus().getReasonPhrase()); errorResponse.put("message", ex.getFieldError().getDefaultMessage()); errorResponse.put("requestId", exchange.getRequest().getId()); return Mono.just(ResponseEntity.badRequest().body(errorResponse)); }

Upvotes: 0

Related Questions