在春季处理空的RequestBody

时间:2019-01-09 09:54:53

标签: java spring spring-boot spring-mvc jackson

我目前正在使用Spring Boot开发一个应用程序,并且我有一个API端点(带有@RequestBody的POST方法),该端点根据请求参数执行不同类型的操作。 例如,如果我收到这样的对象:

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

我需要根据 field1 field2 进行一些转换。因此,当我发送这样的对象时:

{}

Jackson将JSON obj转换为我的模型,但是由于此obj为空,因此Model设置中的所有字段均为 null 。 那么,Spring是否包含一些避免这种情况的方法?

执行以下操作:

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

P.S。对Swagger生成的类进行建模,我无法对其进行修改。

1 个答案:

答案 0 :(得分:1)

您可以根据模型和要执行的验证来实现“ 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());
        }
    }

}

因此上述代码根据您的全局处理程序验证模型并抛出异常主体。