首页 > 解决方案 > 解析headers信息并在bean中设置

问题描述

在我的 spring rest 应用程序中,我需要读取PUTPOST调用的标头信息,并将这些信息设置为传递为@RequestBody. 目前正在做的事情如下。

@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public ReportRepresentation createDailyReport(@RequestBody ReportEntity reportEntity,
        @RequestHeader(value= "FIRST_HEAD1", required  = false) boolean isHeaderSet,
        @RequestHeader(value= "SECOND_HEAD2", required  = false) Long scondHead) {
            // Setting the header values into bean properties .
}

因此,我正在提取所有方法(POST 和 PUT)中的标题并在不同实体中设置值。

我的问题是有没有办法在全局级别解析/ overridein@RequestBody 方法参数并设置这些标头?

标签: javaspringspring-mvc

解决方案


您可以使用RequestBodyAdvice

例如:

豆:

@Data
public class MyBean {
  private String property;
}

控制器:

@RestController
public class MyController {
  @RequestMapping("/")
  public MyBean get(@RequestBody MyBean myBean) {
    return myBean;
  }
}

顾问:

@ControllerAdvice(annotations = RestController.class)
public class MyRequestBodyAdvisor extends RequestBodyAdviceAdapter {
  @Override
  public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
    return methodParameter.getParameterType() == MyBean.class;
  }

  @Override
  public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
    MyBean myBean = (MyBean)body;
    List<String> strings = inputMessage.getHeaders().get("X-Property");
    myBean.setProperty(strings.get(0));
    return myBean;
  }
}

测试:

$ curl localhost:8080 -d '{}' -X POST -H 'X-Property: myProp' -H 'Content-Type: application/json' -s

输出: {"property":"myProp"}


推荐阅读