Sankalp Bhatt
Sankalp Bhatt

Reputation: 81

Java Jakarta Custom Constraint Validator not invoked

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

Answers (1)

Alex
Alex

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

Related Questions