我想制作一個包裝類,它進行預處理,執行傳遞的函式,然后在回傳回應之前進行一些后處理。我如何撰寫包裝類來接受函式作為引數并呼叫它?
@Autowired
private SomeService service;
@GetMapping("/path")
public CustomResponse(CustomRequest request){
1. preprocess(request)
2. CustomResponse response = service.functionA(request)
3. postprocess(response)
4. return response;
------------------------- vs --------------------------------
1. return CustomWrapper.execute(request,???,response)
}
-- **Need help in writing this class.**
class CustomWrapper{
void preprocess();
?? execute();
void postprocess();
}
uj5u.com熱心網友回復:
這基本上應該是您正在尋找的,如果您愿意,您可以對后處理器和前處理器進行硬編碼,以便可以像您的示例一樣使用它,但這更通用:
public class CustomProcessor {
private Function<CustomRequest, CustomRequest> preprocessor;
private Function<CustomResponse, ResponseEntity<CustomResponse>> postprocessor;
public CustomProcessor(
Function<CustomRequest, CustomRequest> preprocessor,
Function<CustomResponse, ResponseEntity<CustomResponse>> postprocessor
) {
this.preprocessor = preprocessor;
this.postprocessor = postprocessor;
}
public ResponseEntity<CustomResponse> execute(CustomRequest request, Function<CustomRequest, CustomResponse> processor) {
request = preprocessor.apply(request);
CustomResponse response = processor.apply(request);
return postprocessor.apply(response);
}
}
uj5u.com熱心網友回復:
在@void void 的幫助下,答案能夠按要求實作。
public class ControllerTemplate<Req, Res> {
private static final Logger logger = LogManager.getLogger(ControllerTemplate.class);
public Res execute(Req req, Function<Req, Res> processor) {
preProcess(req);
Res res = processor.apply(req);
postProcess(res);
return res;
}
private void postProcess(Res res) {
logger.info("response body: {}", res);
}
private void preProcess(Req req) {
logger.info("request body: {}", req);
}
}
呼叫函式
@GetMapping("/logLevel")
public String updateLogLevel(@RequestParam String level) {
return new ControllerTemplate<String, String>()
.execute(level, req -> log4jService.changeLogLevel(req));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485708.html
