为请求映射头创建自定义注释spring

问题描述 投票:1回答:2

我使用的是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头但是招摇,我希望看到所有头参数name.so,我们可以传递方法的所有头。使用地图没有显示任何东西。

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

java spring spring-mvc spring-boot spring-annotations
2个回答
2
投票

您可以将@ModelAttribute用于此目的:


1.Create A Header Holder Class:

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.Refactor getHeaders Controller to use 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());    
}

-1
投票

你可以像这样使用@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中设置。你可以得到你需要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.