小编Kog*_*uro的帖子

如何在Spring WebFlux中记录请求和响应主体

我希望使用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)

kotlin spring-boot project-reactor spring-webflux

21
推荐指数
5
解决办法
2万
查看次数

有没有办法使用注释在Spring MVC上创建具有多个提交按钮的表单?

我正在尝试使用基于注释的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)

forms annotations spring-mvc

4
推荐指数
1
解决办法
2万
查看次数

Joda时间:如何在某个日期间隔获取工作日的日期?

我有两个LocalDates代表一些时间间隔.现在我必须得到所有星期五的LocalDates,这个区间包含.最简单的方法吗?

java datetime date jodatime

3
推荐指数
1
解决办法
8956
查看次数

如何在另一个 Mono 终止后触发 Mono 执行

当我尝试执行 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从未真正执行过。

有没有办法避免这种使用MonoFlux助手?

java reactive-programming project-reactor

2
推荐指数
1
解决办法
8498
查看次数