Обрабатывать пустой RequestBody весной - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я занимаюсь разработкой приложения с использованием Spring Boot, и у меня есть конечная точка API (метод POST с @RequestBody), которая выполняет различные операции на основе параметров запроса. Например, если я получу объект, подобный этому:

{
"field1":["value1"],
"field2":["value2"]
}

Мне нужно сделать некоторые преобразования, основанные на field1 , field2 . Итак, когда я отправляю объект так:

{}

Джексон преобразует объект JSON в мою модель, но поскольку этот объект пуст, все поля в настройках модели имеют значение ноль . Итак, есть ли в Spring какие-то методы, чтобы этого избежать?

Сделай так:

if(allFieldsAreEmpty(requestObj)){
 throw new RuntimeException("All fields are empty.");    
 }

P.S. Модели классов, сгенерированные Swagger, и я не могу его изменить.

1 Ответ

0 голосов
/ 09 января 2019

Вы можете реализовать "org.springframework.validation.Validator" в соответствии с вашими моделями и проверкой, которую вы хотите выполнить. И вы можете использовать InitBinder в вашем контроллере для проверки объекта запроса. Ниже приведен пример, который я использовал один из моих проектов:

@Component(value = "fromToDateValidator")
public class FromToDateValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return (InventorySearchRequestByDate.class.equals(clazz) || OrderRequestDetails.class.equals(clazz));
    }

    @Override
    public void validate(Object target, Errors errors) {
        if (!errors.hasErrors()) {
            Date fromDate = null;
            Date toDate = null;
            if (target instanceof InventorySearchRequestByDate) {
                fromDate = ((InventorySearchRequestByDate) target).getFromDate();
                toDate = ((InventorySearchRequestByDate) target).getToDate();
            } else if (target instanceof OrderRequestDetails) {
                fromDate = ((OrderRequestDetails) target).getFromDate();
                toDate = ((OrderRequestDetails) target).getToDate();
            }
            if (fromDate.compareTo(toDate) > 0) {
                errors.rejectValue("toDate", null, "To Date is prior to From Date");
            }
        }
    }
}

Таким образом, поддерживается метод взятия параметра класса, который проверяет, применима ли проверка класса к модели. Как и в моем примере, я должен проверить объект запроса InventorySearchRequestByDate или объект запроса OrderRequestDetails, поэтому я выполнил проверку в соответствии с датой.

Теперь в методе validate содержится основная логика для проверки модели и добавления ошибок.

Вы можете привязать этот валидатор в вашем контроллере, как показано ниже, и использовать его:

@RestController
public class ItemInventoryController extends BaseController {

    @Autowired
    @Qualifier("fromToDateValidator")
    private Validator fromToDateValidator;

    @Autowired
    private ItemInventoryService itemInventoryService;

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.addValidators(fromToDateValidator);
    }

    @RequestMapping(value = WebServiceEndPoints.INVENTORY_AVAILABILITY_BY_DATE, method = RequestMethod.POST)
    public Map<String, Set<ItemDetails>> getAvailableItems(@RequestBody @Validated InventorySearchRequestByDate
                                                       inventorySearchRequestByDate, BindingResult bindingResult) throws InvalidFieldException {
        validRequest(bindingResult);
        return itemInventoryService.searchItemsByDateAvailablity(inventorySearchRequestByDate.getFromDate()
                , inventorySearchRequestByDate.getToDate());
    }

    public void validRequest(BindingResult bindingResult) throws InvalidFieldException {
        if (bindingResult.hasErrors()) {
            throw new InvalidFieldException(bindingResult.getFieldErrors());
        }
    }

}

Таким образом, приведенный выше код проверяет модель и генерирует тело исключения в соответствии с вашими глобальными обработчиками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...