2

I am using spring-boot-1.5.6. I have a controller inside I have around 8-request mapping which has common headers. Headers mentioned below are mandatory for most of the methods in the controller and mentioning all the headers looks ugly, Is there any way to generalize or custom annotation so that I don't want to replicate the headers in all the method.

@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);

  }

Expected :

@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); 

      }

I know we can use @RequestHeader Map headers but in swagger, I would like to see all the headers parameter name.so that we can pass all the headers for the methods. Using map not showing anything in swagger.

Any hint or suggestion would be appreciable.

3
  • Did you try @RequestHeader HttpHeaders headers? Commented Sep 9, 2018 at 11:48
  • @AmardeepBhowmick Thanks for your reply. I haven't tried yet. Could you please share the link or documentation for that? What is the benefit of that? I would like to see the header names in swagger Commented Sep 9, 2018 at 11:51
  • Check this: stackoverflow.com/a/19556291/3888766 Commented Sep 9, 2018 at 11:53

2 Answers 2

5

You can use @ModelAttribute for this purpose :


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.Define a 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());    
}
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks a lot for your answer. It is working fine but in swagger, It is showing as a request parameter instead of request headers. How can we fix it?
this seems to be an issue with swagger (github.com/springfox/springfox/issues/174), which i also already faced with it but could find any workaround, i think it is going to be worth it to raise another question for that. @VelNaga
-2

You can use @RequestHeader like this ;

@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"));

    }

Request header are set in Map. U can get what u need.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.