【问题标题】:Create custom annotation for request mapping headers spring为请求映射标头spring创建自定义注释
【发布时间】:2019-02-14 01:58:11
【问题描述】:

我正在使用 spring-boot-1.5.6。我里面有一个控制器,我有大约 8 个请求映射,它有共同的标头。下面提到的标头对于控制器中的大多数方法都是强制性的,并且提到所有标头看起来很难看,有什么方法可以概括或自定义注释,以便我不想在所有方法中复制标头。

@RestController
public class RestController {
  private static final Logger logger = LoggerFactory.getLogger(RestController.class);

  /**
   * Simply chooses a few headers, logs them and add them to model to
   * showHeaders view to render to the user.
   */

  @GetMapping(value="/showheaders")

  public String getHeaders(
          @RequestHeader(value="sample") String sample,
          @RequestHeader(value="sample1") String sample1,
          @RequestHeader(value="sample2") String sample2,
          @RequestHeader(value="sample3") String sample3,
          @RequestHeader(value="sample4") String sample4) {
    logger.info("Inside getHeaders() method...");
    logger.info("sample : " + sample);
    logger.info("sample1 : " + sample1);
    logger.info("sample2 : " + sample2);
    logger.info("sample3 : " + sample3);
    logger.info("sample4 : " + sample4);

  }

预期:

@RestController
    public class RestController {
      private static final Logger logger = LoggerFactory.getLogger(RestController.class);

      /**
       * Simply chooses a few headers, logs them and add them to model to
       * showHeaders view to render to the user.
       */

      @GetMapping(value="/showheaders")

      public String getHeaders(@MyHeaders headers) {
        logger.info("Inside getHeaders() method...");
        logger.info("sample : " + sample);
        logger.info("sample1 : " + sample1);
        logger.info("sample2 : " + sample2);
        logger.info("sample3 : " + sample3);
        logger.info("sample4 : " + sample4); 

      }

我知道我们可以使用 @RequestHeader Map headers,但是我想看看所有的 headers 参数名称。这样我们就可以传递方法的所有标头。使用地图没有大张旗鼓地显示任何东西。

任何提示或建议都是值得赞赏的。

【问题讨论】:

  • 你试过@RequestHeader HttpHeaders headers吗?
  • @AmardeepBhowmick 感谢您的回复。我还没试过。你能分享一下链接或文档吗?这样做有什么好处?我想在 swagger 中查看标题名称

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


【解决方案1】:

您可以为此使用@ModelAttribute


1.创建一个Header Holder类:

public class MyheaderHolder {
    private String sample;
    private String sample1;
    private String sample2;
    private String sample3;
    private String sample4;
    //getter setters
}

2.定义一个ModelAttribute:

@ModelAttribute("myHeaderHolder")
public Something addSomething(@RequestHeader(value = "sample") String sample,
    @RequestHeader(value = "sample1") String sample1,
    @RequestHeader(value = "sample2") String sample2,
    @RequestHeader(value = "sample3") String sample3,
    @RequestHeader(value = "sample4") String sample4) {
    return new MyHeaderHolder(name);
}

3.重构getHeaders Controller以使用ModelAttribute

@GetMapping(value = "/showheaders")
public String getHeaders(@ModelAttribute MyHeaderHolder myHeaderHolder) {
    logger.info("Inside getHeaders() method...");
    logger.info("sample : " + myHeaderHolder.getSample());
    logger.info("sample1 : " + myHeaderHolder.getSample1());
    logger.info("sample2 : " + myHeaderHolder.getSample2());
    logger.info("sample3 : " + myHeaderHolder.getSample3());
    logger.info("sample4 : " + myHeaderHolder.getSample4());    
}

【讨论】:

  • 非常感谢您的回答。它工作正常,但大摇大摆,它显示为请求参数而不是请求标头。我们该如何解决?
  • 这似乎是 swagger (github.com/springfox/springfox/issues/174) 的问题,我也已经遇到过,但可以找到任何解决方法,我认为为此提出另一个问题是值得的. @VelNaga
【解决方案2】:

你可以像这样使用@RequestHeader ;

@GetMapping(value="/showheaders")
    public String getHeaders(@RequestHeader Map<String, String> myHeaders) {
        logger.info("Inside getHeaders() method...");
        logger.info("sample : " + myHeaders.get("sample"));
        logger.info("sample1 : " + myHeaders.get("sample1"));
        logger.info("sample2 : " + myHeaders.get("sample2"));
        logger.info("sample3 : " + myHeaders.get("sample3"));
        logger.info("sample4 : " + myHeaders.get("sample4"));

    }

请求标头在 Map 中设置。你可以得到你需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2013-07-13
    • 2017-05-05
    相关资源
    最近更新 更多