javaspring-bootvalidationrequiredfieldvalidator

Spring Boot: Controller doesn't take in account Validator


I'm trying to accomplish the use of a validator into the controller. The two fields origin and destination should be of three capital letters as IATA Code. But it acts without filter, and any request is accepted.

Set of validator interface:

@Documented
@Constraint(validatedBy = IATACodeValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IATACodeConstraint {
    String message() default "Invalid IATA code";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Class of Validator:

public class IATACodeValidator implements ConstraintValidator<IATACodeConstraint, String> {

@Override
public void initialize(IATACodeConstraint iataCode) {
}

@Override
public boolean isValid(String codeField, ConstraintValidatorContext context) {
    return codeField != null && codeField.matches("^[A-Z]{3}+$")
            && (codeField.length() == 3);
}

Basic class:

public class CrazyAirRequest {

    @IATACodeConstraint
    private String origin;
    @IATACodeConstraint
    private String destination;
    private String departureDate;
    private String returnDate;
    private int passengerCount;

// getters & setters

Controller:

@RestController
@RequestMapping("flights")
@Validated
public class BusyFlightsController {


    CrazyAirDatabase crazyAirService;
    ToughJetDatabase toughJetService;

    @Autowired
    public BusyFlightsController(CrazyAirDatabase crazyAirService, ToughJetDatabase toughJetService) {
        this.crazyAirService = new CrazyAirDatabase();
        this.toughJetService = new ToughJetDatabase();
    }


    @RequestMapping(value = "/crazy-air-response", method = RequestMethod.GET)
    public List<CrazyAirResponse> getCrazyAirResponse(
            @RequestParam("origin")  String origin,
            @RequestParam("destination")  String destination,
            @RequestParam("departureDate") String departureDate,
            @RequestParam("returnDate") String returnDate,
            @RequestParam("passengerCount") int passengerCount
    ) {
        CrazyAirRequest crazyAirRequest = new CrazyAirRequest(origin, destination, departureDate, returnDate,
                passengerCount);
        return crazyAirService.getCrazyAirResponse(crazyAirRequest);
    }

Solution

  • @virendra chauhan: thank you for your inspiration.

    I solved so:

     @RequestMapping(value = "/crazy-air-response", method = RequestMethod.GET)
    public List<CrazyAirResponse> getCrazyAirResponse(
            @RequestParam("origin") @Pattern(regexp = "^[A-Z]{3}", message = "Invalid IATA code")
                    String origin,
            @RequestParam("destination") @Pattern(regexp = "^[A-Z]{3}", message = "Invalid IATA code")
                    String destination,
            @RequestParam("departureDate") String departureDate,
            @RequestParam("returnDate") String returnDate,
            @RequestParam("passengerCount") int passengerCount
    ) {
        CrazyAirRequest crazyAirRequest = new CrazyAirRequest(origin, destination, departureDate, returnDate,
                passengerCount);
        return crazyAirService.getCrazyAirResponse(crazyAirRequest);
    }