当前位置: 首页 > 知识库问答 >
问题:

如何用相同的方法和不同的头简化REST控制器?

弘浩博
2023-03-14
@PostMapping("/number")
Integer getNumber(@RequestHeader("no") String number, @RequestBody User user) {
    /*...*/
}
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user) {
    /*...*/
}

我有多达10个方法在一个控制器,他们应该有相同的名称和逻辑,但不同的头。请求路径前缀可能不同。

如何简化REST控制器,而不是创建两个不同的控制器,使用相同的方法和相同的逻辑?

我尝试了几个例子来创建一个控制器,该控制器具有两个不同的接口,方法相同,但映射不同。

@RestController
@RequestMapping(path ="/application")
@Api(tags = {"application"})
public class ApplicationController implements AppMapping1, AppMapping2 {

    @Override
    public Integer getNumber(String number, User user) {
        /*...*/
    }
}
interface AppMapping1 {

    @PostMapping("/num")
    Integer getNumber(@RequestHeader("num") String number, @RequestBody User user);
}
interface AppMapping2 {

    @PostMapping("/number")
    Integer getNumber(@RequestHeader("number") String number, @RequestBody User user);
}

控制器仅与第一个接口映射。因此http://.../application/num工作正常,但http://.../application/number-获取404错误代码。这意味着Java Spring-Boot没有这样的功能。需要更多的点子。

Java8开发的项目;spring-boot:2.1.1.release分级

共有1个答案

蒋正平
2023-03-14

根据这一点,如果我们不确定会出现哪些头,或者我们需要的头比我们在方法签名中想要的多,我们可以使用@RequestHeader注释,而不需要特定的名称。

对于变量类型,您有几种选择:MapMultiValueMapHttpHeaders对象。

样品

@PostMapping("/number")
public Integer getNumber(@RequestHeader Map<String, String> headers) {

    if (Optional.ofNullable(headers.get("no")).isPresent()){
        //...
    }
    else if (Optional.ofNullable(headers.get("number")).isPresent())
    {
        //...
    }

}
 类似资料:
  • 我的应用程序中有两个方法,它们使用相同的请求映射和不同的(http)方法 是否有可能在不同的控制器中定义它们,或者我应该考虑一些(可怕的)变通方法(比如重命名一个URL)?

  • 我有看起来像这样的RestController: 我想知道如何将模拟对象传递给其他Controller,后者可以处理数据并将其保存到其他存储库。例如,它可以如下所示: 但我知道这种做法是不允许的。有什么办法可以做到这一点?

  • 我的控制器 这是我的控制器测试用例 我正在将User对象转换为string并将其发布到控制器方法。我正在尝试模拟userService.validateUser()将返回新的空User对象的服务方法。由于发布到service方法的对象和控制器接收到的对象不同,所以service返回null。如何让service方法返回空用户对象?

  • 我有一个从XML映射的类。为了简单起见,让我们想象这个类是这样的: 现在,现有的代码中充满了像这样的方法: …等等。你肯定有这个想法。 我需要包含一个新的方法来从employee返回一个新的属性,但是由于我觉得这对mantain来说是可怕的,所以我拒绝在那里添加一个新的方法。我正在考虑使用action模式,以某种方式避免至少重复againg和for循环,但我不得不说,我找不到一个聪明的解决方案。

  • Swagger用相同的路径和方法但不同的参数覆盖方法 我有一个带有Spring Boot 2.3.5.RELEASE,webflux和springfox 3.0.0的应用程序。我开发了两个具有相同路径但参数不同的GET方法,一个不接收参数并返回list,另一个返回findAll。 情况是,Swagger只生成其中一种方法的文档,有时是列表,有时是分页。我怎么能告诉swagger他们是不同的方法,并

  • 3. 我不想在我的API中传递所有的参数作为请求体,有些只有查询、变量、输入有些只有查询和变量,就像上面的json数据,我想创建相同的模型,可以在其余的API中使用。目前,我已经为每个API创建了不同的模型。 公共类CreatetRequest{ } 这里我在所有API中复制了我的模型,所以我想创建三个模型类,其中包含所有必需的变量,这些变量在我的引导应用程序中都是常见的,但同时我必须避免在res