Tag: 春天webflux

如何在弹簧反应堆中将两台出版商结合在一起

我实现了我的一个虚拟反应仓库。 我正在与更新方法斗争: @Override public Mono<User> updateUser(int id, Mono<User> updateMono) { return //todo with getUser } @Override public Mono<User> getUser(int id) { return Mono.justOrEmpty(this.users.get(id)); } 从一方面我有传入发布者Mono<User> updateMono ,另一方面,我有Mono.justOrEmpty(this.users.get(id))期间另一个出版商。 如何将它们结合在一起,进行更新,并只返回一个发布者? 我唯一想到的是: @Override public Mono<User> updateUser(int id, Mono<User> updateMono) { return getUser(id).doOnNext(user -> { updateMono.subscribe(update -> { users.put(id, new User(id, update.getName(), update.getAge())); System.out.format("Updated user with id %d to […]

如何用Spring WebFlux返回404

我有一个这样的控制器(在Kotlin中): @RestController @RequestMapping("/") class CustomerController (private val service: CustomerService) { @GetMapping("/{id}") fun findById(@PathVariable id: String, @RequestHeader(value = IF_NONE_MATCH) versionHeader: String?): Mono<HttpEntity<KundeResource>> = return service.findById(id) .switchIfEmpty(Mono.error(NotFoundException())) .map { // ETag stuff … ok().eTag("…").body(…) } } 我想知道是否有一个更好的方法比抛出一个异常是用@ResponseStatus(code = NOT_FOUND)注解@ResponseStatus(code = NOT_FOUND)

在spring-webflux中处理错误的正确方法是什么?

我一直在使用spring-webflux做一些研究,我想知道什么应该是正确的方式来处理错误使用路由器功能。 我创建了一个小项目来测试几个场景,我喜欢得到关于它的反馈,看看其他人在做什么。 到目前为止,我所做的是。 给出以下路由功能: @Component public class HelloRouter { @Bean RouterFunction<?> helloRouterFunction() { HelloHandler handler = new HelloHandler(); ErrorHandler error = new ErrorHandler(); return nest(path("/hello"), nest(accept(APPLICATION_JSON), route(GET("/"), handler::defaultHello) .andRoute(POST("/"), handler::postHello) .andRoute(GET("/{name}"), handler::getHello) )).andOther(route(RequestPredicates.all(), error::notFound)); } } 我已经在我的处理程序上做了这个 class HelloHandler { private ErrorHandler error; private static final String DEFAULT_VALUE = "world"; HelloHandler() { error = new […]

在Spring Boot 2.0.0.M1中将Jackson配置为“全局”使用SNAKE_CASE

我使用Spring Boot 2.0.0.M1 (因此Spring 5.0.0.RC1 )。 我试图将其配置为使用PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE但到目前为止我不工作。 我试过了: 具有以下内容的application.yml文件: spring: jackson: property-naming-strategy: SNAKE_CASE 配置Jackson2ObjectMapperBuilder bean: @Bean @Primary open fun jacksonBuilder(): Jackson2ObjectMapperBuilder { val jacksonMapperBuilder = Jackson2ObjectMapperBuilder() .failOnUnknownProperties(false) .modules(JavaTimeModule(), KotlinModule()) .propertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE) logger.info { "Jackson2ObjectMapperBuilder configured successfully…" } return jacksonMapperBuilder } 配置一个ObjectMapper bean: @Bean @Primary open fun objectMapper(): ObjectMapper { val objectMapper = ObjectMapper() objectMapper.registerModule(JavaTimeModule()) objectMapper.registerModule(KotlinModule()) objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE) […]

如何在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" } } } 这里的请求方法和路径日志成功,但身体是Mono ,所以我应该如何登录? 应该是相反的方式,我必须订阅请求正文Mono ,并在回调登录? 另一个问题是ServerResponse接口在这里不能访问响应主体。 我怎样才能在这里? 我试过的另一种方法是使用WebFilter @Bean […]

用Spring 5 WebFlux框架解码ByteArray

我试图用kotlin来使用新的Spring WebFlux框架。 而我无法找到这个代码(myService)的错误: fun foo(): Flux<ByteArray> { val client = WebClient.create("http://byte-array-service") return client .get() .uri("/info") .accept(MediaType.APPLICATION_OCTET_STREAM) .exchange() .flatMapMany { r -> r.bodyToFlux(ByteArray::class.java) } } 这个方法返回Flux 7893字节,我知道并不是byte-array-service发送的所有字节。 如果我使用旧式的休息模板一切正常 fun foo(): Flux<ByteArray> { val rt = RestTemplate() rt.messageConverters.add( ByteArrayHttpMessageConverter()) val headers = HttpHeaders() headers.accept = listOf(MediaType.APPLICATION_OCTET_STREAM) val entity = HttpEntity<String>(headers) val r = rt.exchange("http://byte-array-service/info", HttpMethod.GET,entity, ByteArray::class.java) return […]

Spring Boot 2&Spring 5错误服务index.html

我有一个简单的Spring启动应用程序写在Kotlin。 @SpringBootApplication class DemoApplication fun main(args: Array<String>) { SpringApplication.run(DemoApplication::class.java, *args) } @Controller class HomeController { @GetMapping("/") fun home() = "index.html" } 在resource/public文件夹我有index.html 。 但是,当我打开我的浏览器并键入localhost:8080/我得到了错误java.lang.IllegalStateException: Could not resolve view with name 'index.html'在运行的Spring启动控制台java.lang.IllegalStateException: Could not resolve view with name 'index.html' 。 我只想要最简单的代码possbile服务于index.html。 不应该那么辛苦? ;) 注意:我正在使用Spring-Web-Reactive

如何检查单声道是否为空?

我正在使用WebFlux框架开发Spring Boot 2.0和Kotlin的应用程序。 我想检查一个用户ID是否保存一个事务之前退出。 我被困在一个简单的东西,如验证单声道是空的。 fun createTransaction(serverRequest: ServerRequest) : Mono<ServerResponse> { val transaction = serverRequest.body(BodyExtractors.toMono(Transaction::class.java)) transaction.flatMap { val user = userRepository.findById(it.userId) // If it's empty, return badRequest() } return transaction.flatMap { transactionRepository.save(it).then(created(URI.create("/transaction/" + it.id)).build()) } } 有可能做我想做的事情?

WebFlux功能:如何检测一个空的通量并返回404?

我有以下简化的处理函数(Spring WebFlux和使用Kotlin的功能性API)。 但是,我需要一个提示如何检测一个空的Flux,然后使用noContent()为404,当Flux为空时。 fun findByLastname(request: ServerRequest): Mono<ServerResponse> { val lastnameOpt = request.queryParam("lastname") val customerFlux = if (lastnameOpt.isPresent) { service.findByLastname(lastnameOpt.get()) } else { service.findAll() } // How can I detect an empty Flux and then invoke noContent() ? return ok().body(customerFlux, Customer::class.java) }

如何使用Spring Boot和Spring WebFlux的“功能bean定义Kotlin DSL”?

在https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt ,注释显示了如何定义Spring Beans通过新的“功能bean定义Kotlin DSL”。 我也发现https://github.com/sdeleuze/spring-kotlin-functional 。 但是,这个例子使用的只是普通的 Spring而不是Spring Boot 。 任何提示如何与Spring Boot一起使用DSL是值得赞赏的。