Search code examples
javaspringspring-mvcspring-bootspring-annotations

Create custom annotation for request mapping headers spring


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.


Solution

  • 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());    
    }