Java - Отключить проверку Spring полей класса в особых случаях - PullRequest
0 голосов
/ 03 октября 2019

В моей текущей реализации Проверка для двух полей SpecialTransactionDTO (transactionMetric и transactionRank) работает во всех случаях. Теперь его родительский класс TransactionDTO, который я получаю как @RequestBody, содержит логическое поле shouldValidate, которое указывает, проверять ли два поля SpecialTransactionDTO или нет.

Как настроить (отключить) проверку для случаев, когда значение shouldValidate flag равно false?

@PostMapping("{id}/transaction/")
@ApiOperation(value = "Create transaction", httpMethod = "POST", response = TransactionDTO.class)
public ResponseEntity<Object> createTransaction(@PathVariable("id") Long accountId,
                                                  @Validated({TransactionNumber.class})
                                                  @RequestBody TransactionDTO transaction)
    throws NotFoundException, URISyntaxException {

    TransactionDTO result = transactionService.createTransaction(accountId, transaction);

    return ResponseEntity.created(new URI("api/userAccount/" + accountId)).body(result);
}

@JsonSubTypes({
    @JsonSubTypes.Type(value = SpecialTransactionDTO.class, name = SpecialTransactionDTO.TYPE),
    @JsonSubTypes.Type(value = TransactionDTO.class, name = TransactionDTO.TYPE)
})

public class TransactionDTO {

    @NotNull
    private Long id;

    @NotNull
    private String transactionInitiator;

    private Boolean shouldValidate;
    private String transactionCode;
}

public class SpecialTransactionDTO extends TransactionDTO {

    @NotNull
    private Long userId;

    @Pattern(regexp = "0|\\d{8,11}")
    private String transactionMetric;

    @Pattern(regexp = "\\d{1,3}")
    private String transactionRank;
}

1 Ответ

1 голос
/ 09 октября 2019

Вы можете полностью исключить аннотацию @Validated и имитировать поведение Spring следующим образом:

@PostMapping("{id}/transaction/")
@ApiOperation(value = "Create transaction", httpMethod = "POST", response = TransactionDTO.class)
public ResponseEntity<Object> createTransaction(@PathVariable("id") Long accountId,
                                                @RequestBody TransactionDTO transaction)
    throws NotFoundException, URISyntaxException, MethodArgumentNotValidException {

    // Check if we should validate here. Spring will convert your MethodArgumentNotValidException into HTTP 400
    if(transaction.shouldValidate) {
        SpringValidatorAdapter adapter = new SpringValidatorAdapter(validator);
        BeanPropertyBindingResult result = new BeanPropertyBindingResult(transaction, transaction.getClass().getName());
        adapter.validate(transaction, result, TransactionNumber.class);
        if (result.hasErrors()) {
            throw new MethodArgumentNotValidException(null, result);
        }
    }    


    TransactionDTO result = transactionService.createTransaction(accountId, transaction);

    return ResponseEntity.created(new URI("api/userAccount/" + accountId)).body(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...