【问题标题】:How to overload Spring Boot RestController methods that use @RequestBody?如何重载使用 @RequestBody 的 Spring Boot RestController 方法?
【发布时间】:2021-04-21 22:30:41
【问题描述】:

我有兴趣重载 @PostMapping 或 /digital/testCase,它有两个单独的签名,它们使用 @RequestBody 注释来传递数据,而不是 @RequestParams。这很重要,因为 StackOverflow 上的所有其他问题都与后者有关。目前,当我尝试重载函数时,Spring Boot 会崩溃。

对于那些有兴趣查看代码的人来说,它看起来像这样

package com.example.test;

import *

@RestController
@RequestMapping(path = "/digital", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)

public class TestController {

    private static final Logger LOG = LoggerFactory.getLogger(TestController.class);

    @Autowired
    private testDomain testDomain;


    @PostMapping("/testCase")
    public ResponseEntity<Object> testCase(@RequestBody InitiateTestCase initiateTestCase,
                                               HttpServletRequest request) {

        //
        ...some code here
        //
    }

    @PostMapping("/testCase")
    public ResponseEntity<Object> testCase(@RequestBody InitiateTestCase[] initiateTestCases,
                                               HttpServletRequest request) {

        //
        ...some code here
        //
    }
}

【问题讨论】:

  • 不,这在春季不可用
  • 确切地说,您希望 Spring 如何区分两个控制器方法之间的传入调用?
  • 这不起作用,因为它会导致将单个 URL 映射到 2 个方法。 Spring 无法区分调用哪一个。 @PostMapping 中的内容用于将传入的请求映射到一个方法,每个方法的属性组合必须是唯一的。
  • @chrylis - 好吧,我希望和/或在想,理想情况下,Spring 可以主动将 JSON 结构与两个 RequestBody 定义进行比较,如果匹配,则使用该方法...我假设我实际上可能有兴趣将其编写为包装器方法(例如,URL 命中包装器方法)。然后让包装器方法使用重载来调用函数......理想情况下,需要发生重载(或一些可行的替代品,如功能链),因为被命中的 URL 必须根据项目需要接受这些情况的各种格式.

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


【解决方案1】:

您可以尝试将一些特定的参数/标题添加到 PostMapping 注释中,以便 Spring 能够正确映射它。解决此类问题的另一种方法是将您的 pojo 抽象为 RequestBody 而不是重载方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多