我有一個 SpringBoot 專案,在每個端點的第一個呼叫是將請求標頭決議為 POJO 物件。確保設定了所需的標題。是否有可能“教”SpringBoot 能夠在端點中提供自定義物件?
class CommonHeader {
private String callerId;
private String systemId;
....
public static CommonHeader parseCommonHeader(Map<String, String> map) {
CommonHeader header = new CommonHeader();
header.setCallerId(map.get("x-caller-id"));
.....
return header;
}
}
@Path("/columnConfigs")
Response getColumnConfig(@RequestHeader Map<String, String> headers) {
CommonHeader commonHeader = parseCommonHeader(headers);
....
}
@Path("/other")
Response getColumnConfig(@RequestHeader Map<String, String> headers) {
CommonHeader commonHeader = parseCommonHeader(headers);
....
}
我希望能夠將以下代碼簡化為:
@Path("/columnConfigs")
Response getColumnConfig(CommonHeader commonHeader) {
....
}
@Path("/other")
Response getColumnConfig(CommonHeader commonHeader) {
....
}
uj5u.com熱心網友回復:
定義CommonHeader擴展Map<String, String>:
@RequestHeader
public interface CommonHeader extends Map<String, String> {
}
uj5u.com熱心網友回復:
我正在為此尋找一些解決方案,即將標題系結到我們定義的物件。我在這里找到了一個很好的技術:在 SpringMVC 中使用自定義資料系結器
簡而言之,除了已經創建的CommonHeader類之外,您必須做的就是這些:
- 定義一個注解,比如說
@MyHeaders(用@Retention( RUNTIME )和@Target( PARAMETER ))
@Retention( RUNTIME )
@Target( PARAMETER )
public @interface MyHeaders {}
- 創建一個實作
HandlerMethodArgumentResolver,比如說MyHeadersResolver。這會將請求中的標頭映射到 的實體CommonHeader并回傳它。
@Override
public boolean supportsParameter( MethodParameter methodParameter ){
return methodParameter.getParameterAnnotation( MyHeaders.class ) != null;
}
@Override
public Object resolveArgument( MethodParameter methodParameter, ModelAndViewContainer mavc, NativeWebRequest req, WebDataBinderFactory wdbf ) throws Exception{
HttpServletRequest request = (HttpServletRequest) req.getNativeRequest();
CommonHeader h = new CommonHeader();
Collections.list( request.getHeaderNames() ).forEach( header -> {
switch( header.toLowerCase() ) {
//Set values into CommonHeader instance
}
});
return h;
}
- 將此宣告給 SpringMVC 作為實作 的類中的引數決議器
WebMvcConfigurer,如下所示:
@Override
public void addArgumentResolvers( List<HandlerMethodArgumentResolver> resolvers ) {
resolvers.add( new MyHeadersResolver() );
}
- 您的控制器方法簽名現在將如下所示:
Response getColumnConfig( @MyHeaders CommonHeader commonHeader )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349028.html
