Spring Boot: контроллер не принимает во внимание Validator - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь выполнить 1016 * использование валидатора в контроллере. Два поля origin и destination должны состоять из трех заглавных букв в качестве кода IATA. Но он действует без фильтра, и любой запрос принимается.

Набор интерфейса валидатора:

@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 {};
}

Класс валидатора:

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);
}

Basi c класс:

public class CrazyAirRequest {

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

// getters & setters

Контроллер:

@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);
    }

Ответы [ 2 ]

1 голос
/ 21 марта 2020

@ virendra chauhan: спасибо за ваше вдохновение.

Я решил так:

 @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);
}
1 голос
/ 21 марта 2020

Вы можете напрямую использовать аннотацию @Pattern без создания собственного валидатора для двух полей, как показано ниже:

@Pattern(regexp ="^[A-Z]{3}" message ="Invalid IATA code")
private String origin;
@Pattern(regexp ="^[A-Z]{3}" message ="Invalid IATA code")
private String destination;
...