在我的 spring rest 应用程序中,我需要读取 PUT
的 header 信息和 POST
调用并在作为 @RequestBody
传递的 bean 中设置这些信息.目前正在做的事情如下。
@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)中的 header 并在不同实体中设置值。
我的问题是有什么方法可以解析/override
@RequestBody
在全局级别的方法参数中并设置这些 header ?
最佳答案
您可以使用RequestBodyAdvice
:
例如:
bean 类:
@Data
public class MyBean {
private String property;
}
Controller :
@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"}
关于java - 解析headers信息并设置到bean中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871204/