Reputation: 81
I have created Custom ContrainValidator and added the code below. I have also added my controller class. Somehow code is not flowing in the validator.
ValidCustomClass class
package com.validation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Constraint(validatedBy = MyValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
public @interface ValidCustomClass {
String message() default "Invalid request.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Validator class
package com.validation;
import com.model.request.CreateRequest;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyValidator implements ConstraintValidator<ValidCustomClass, CreateRequest> {
private static final String MY_REGEX = "^(.+)@(.+)$";
public MyValidator() {
}
@Override
public void initialize(ValidCustomClass constraintAnnotation) {
// DO nothing here
}
@Override
public boolean isValid(final CreateRequest value, final ConstraintValidatorContext context) {
if (dosSomething(value)) return false;
return true;
}
}
Controller class
package com.controller;
import com.model.request.CreateRequest;
import com.model.response.MyResponse;
import com.service.MyService;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Validated
@RequestMapping("/endpoint")
public class MyController {
private final MyService myService;
MyController(MyService myService) {
this. myService = myService;
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public MyResponse create(@RequestBody @Valid CreateRequest request) throws Exception {
return myService.create(request);
}
}
finally I have added @ValidCustomClass
on CreateRequest
.
Am I missing something here? There are no errors but the validator in not invoked.
Upvotes: -1
Views: 164
Reputation: 661
Class CreateRequest or a field inside the class should be annotated with custom annotation like this
@ValidCustomClass
public class CreateRequest {
}
See examples at https://www.baeldung.com/spring-mvc-custom-validator
Upvotes: 0