温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - How to simplify REST controllers with same methods and different headers?
gradle java rest spring spring-boot

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

发布于 2020-03-27 15:58:03

我有一个Java REST API,供2个不同的使用者使用。默认情况下,REST原则我的API应该定义请求标头的名称。但是现在我没有共同的情况。消费者使用不同的安全层,该安全层提供不同的头,这两种方式都意味着相同的参数。

示例方法:( 不是真实代码)
对于第一个使用者:

@PostMapping("/number")
Integer getNumber(@RequestHeader("no") String number, @RequestBody User user) {
    /*...*/
}

对于第二个消费者:

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

一个控制器中最多有10个方法,它们应该具有相同的名称和逻辑,但标头不同。请求路径前缀可以不同。


题:

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


我试过的

我尝试了几个示例,使用相同的方法,但映射不同,创建了一个具有2个不同接口的控制器。

例:

控制器类

@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没有这种功能。需要更多的想法。

开发项目Java 8; spring-boot:2.1.1.RELEASE;gradle

查看更多

查看更多

提问者
Dumbo
被浏览
190
Mehrdad HosseinNejad 2020-01-31 17:48

根据这个,如果我们还不能确定这头会出现,或者我们需要更多的人比我们希望在我们的方法的签名,我们可以使用@RequestHeader注解没有一个特定的名称。

变量类型有几种选择:a Map,a MultiValueMapHttpHeaders对象。

样品

@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())
    {
        //...
    }

}