使用spring boot支持RequestBody或RequestParam的Web服务

时间:2017-07-13 14:12:54

标签: java web-services spring-boot request

我们的大多数过滤都是使用@RequestBody完成的,这很好,因为它会自动将帖子中发送的所有字段映射到我们选择的对象。我们已经请求允许在URL中传递get和just参数。以我们想要的方式支持这些家伙是一场战斗,但最终我们做出了改变。唯一的问题是,它使它非常笨重(至少对于我的实现。)我正在寻找建议,使其更清洁,更少手动。

在:

    @RequestMapping(path = "forecast/filter", method = RequestMethod.POST)
List<FinancialContractData> forcastFilter(            
        @RequestBody(required = false) FinancialContractData filter) {

    filter = filter ?: new FinancialContractData()

    List<PortfolioContractInvoiceBook> curBooks = getPortContrInvBooks(filter)

后:

    @RequestMapping(path = "forecast/filter", method = [RequestMethod.POST, RequestMethod.GET])
List<FinancialContractData> forcastFilter(
        @RequestParam(value = "startDt", required = false) Date startDt,
        @RequestParam(value = "contractId", required = false) Integer contractId,
        @RequestParam(value = "differencesOnly", required = false) boolean differencesOnly,
        @RequestBody(required = false) FinancialContractData filter) {

    filter = filter ?: new FinancialContractData()

    filter.startDt = startDt ? new RBSDate(startDt.time).asCalendar(): filter.startDt
    filter.startDt = filter.startDt ?: defaultDate
    filter.contractId = contractId ?: filter.contractId
    filter.differencesOnly = differencesOnly ?: filter.differencesOnly

    List<PortfolioContractInvoiceBook> curBooks = getPortContrInvBooks(filter)

这个特定的SAP组只需要过滤对象上的三个属性(还有很多)。我喜欢将所有参数一般映射到对象上的属性。我倾向于对控制器的建议,以便我们所有的方法都可以免费获得。春天还有其他任何我想不到的隐藏的宝石吗?

2 个答案:

答案 0 :(得分:0)

如果模型具有适当的setter和getter,则可以传递模型:

forcastFilter(MyRequestModel model)

请参阅:https://stackoverflow.com/a/16942352/5585182

答案 1 :(得分:0)

这对我来说似乎是最简单的解决方案。

    @RequestMapping(path = "forecast/filter", method = [RequestMethod.POST, RequestMethod.GET])
List<FinancialContractData> forcastFilter(
    @RequestBody(required = false) FinancialContractData filter, FinancialContractData paramFilter) {

filter = filter ?: paramFilter

List<PortfolioContractInvoiceBook> curBooks = getPortContrInvBooks(filter)

它仍然需要指定两个参数并选择一个参数(我优先考虑POST主体),但它非常干净,并且不会因合并数据而混乱。