我希望使用Kotlin在Spring WebFlux上的REST API中集中记录请求和响应.到目前为止,我已经尝试过这种方法
@Bean
fun apiRouter() = router {
(accept(MediaType.APPLICATION_JSON) and "/api").nest {
"/user".nest {
GET("/", userHandler::listUsers)
POST("/{userId}", userHandler::updateUser)
}
}
}.filter { request, next ->
logger.info { "Processing request $request with body ${request.bodyToMono<String>()}" }
next.handle(request).doOnSuccess { logger.info { "Handling with response $it" } }
}
Run Code Online (Sandbox Code Playgroud)
这里请求方法和路径日志成功但身体是Mono,所以我该如何记录呢?应该是相反的方式,我必须订阅请求正文Mono并将其记录在回调中?另一个问题是ServerResponse这里的接口无法访问响应主体.我怎么能在这里得到它?
我尝试过的另一种方法是使用 WebFilter
@Bean
fun loggingFilter(): WebFilter =
WebFilter { exchange, chain ->
val request = exchange.request
logger.info { "Processing request method=${request.method} path=${request.path.pathWithinApplication()} params=[${request.queryParams}] body=[${request.body}]" }
val result …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用基于注释的Spring MVC创建简单的添加/删除表单."添加"功能顺利进行,但当我尝试添加另一个按钮时,我遇到了困难.
这是我的代码:
控制器动作:
@RequestMapping(value = "/books/documentType.do", method = RequestMethod.GET)
public String getDocType(
@RequestParam(required = false, value = "id") Long id,
ModelMap model) {
DocTypeDTO docType = new DocTypeDTO();
if (id != null)
docType = docTypeConverter.getDTO(id);
model.addAttribute("docType", docType);
return "/books/documentType";
}
@RequestMapping(value = "/books/documentType.do", method = RequestMethod.POST)
public String setDocType(
@ModelAttribute("docType") DocTypeDTO docType,
BindingResult result,
SessionStatus sessionStatus
) {
docTypeValidator.validate(docType, result);
if (result.hasErrors())
return "/books/documentType";
else {
docTypeConverter.saveDTO(docType);
sessionStatus.setComplete();
return "redirect:/books/documentTypes.do";
}
}
Run Code Online (Sandbox Code Playgroud)
非常标记的形式:
<form:form method="post" commandName="docType" id="editForm">
<table width="100%" …Run Code Online (Sandbox Code Playgroud) 我有两个LocalDates代表一些时间间隔.现在我必须得到所有星期五的LocalDates,这个区间包含.最简单的方法吗?
当我尝试执行 Mono insidedoFinally子句时遇到问题。这是我的代码。
public interface Locks {
Mono<ReactiveDistributedLock> doLock(LockParams params);
Mono<Boolean> doUnlock(ReactiveDistributedLock lock);
default <T> Mono<T> withLock(LockParams params, Supplier<Mono<T>> stage) {
return doLock(params)
.flatMap(lock -> stage.get().doFinally(ignored -> doUnlock(lock)));
}
Run Code Online (Sandbox Code Playgroud)
问题是doUnlock(lock)insidedoFinally()返回一个没有人订阅的单声道,因为doFinally它没有链接。所以异步代码部分doUnlock从未真正执行过。
有没有办法避免这种使用Mono或Flux助手?
java ×2
annotations ×1
date ×1
datetime ×1
forms ×1
jodatime ×1
kotlin ×1
spring-boot ×1
spring-mvc ×1