gpt4 book ai didi

spring-mvc - Spring Boot + Spring MVC + Ratpack 可能吗?

转载 作者:行者123 更新时间:2023-12-04 10:24:42 24 4
gpt4 key购买 nike

我们是一家 Spring Boot 商店,我们的 REST 端点严重依赖 Spring MVC。我们使用 Boot 和嵌入式 Tomcat 创建自托管 JAR。是否可以用 Ratback 替换 Tomcat,同时仍然保留我所有的 Spring MVC 代码?我担心 Spring MVC 以某种方式与 servlet 规范绑定(bind),并且在没有 servlet 容器的情况下将无法运行。我知道 dsyer/spring-boot-ratpack工作,但在浏览代码后无法确定 Spring MVC 是否可以很好地使用桥接。有没有人知道任何可以让我们保留对 Spring MVC 的投资并让 Spring Boot 使用 Ratpack 来管理 HTTP 流量的工作?

最佳答案

我怀疑您的问题的症结可以提炼为:“我们可以将我们的 Spring Controller 放在 Ratpack 的非阻塞 HTTP 层之上吗?”这个问题最简单的答案是否定的,因为 MVC 编程模型不太适合响应式/NIO 模型。

但是,如果您的应用程序遵循一些常见的模型- View - Controller (和服务)模式,那么您的 Controller 实际上应该只是执行数据绑定(bind)、解析和委托(delegate)给服务层。如果是这种情况,那么您的 Controller 中的代码可能已经是非阻塞的,您可以轻松地将其转换为 Ratpack 代码。

例如,考虑以下 @RestController在 Spring Boot 应用程序中:

@RestController
@RequestMapping("/user")
class UserController {

@Autowired
UserService userService

@RequestMapping(method = RequestMethod.POST)
Long create(@RequestBody @Valid User user) {
User savedUser = userService.save(user)
return savedUser.id
}
}

Spring 的数据绑定(bind)方面是一个计算过程(即不受 I/O 限制),因此我们可以轻松地将其转换为 Ratpack 处理程序:
import app.SpringConfig
import app.User
import app.UserService
import org.springframework.boot.SpringApplication
import org.springframework.context.ApplicationContext
import ratpack.jackson.JacksonModule

import static ratpack.groovy.Groovy.ratpack
import static ratpack.jackson.Jackson.fromJson
import static ratpack.jackson.Jackson.json
import static ratpack.spring.Spring.spring

ratpack {
bindings {
add(new JacksonModule())
bindInstance(ApplicationContext, SpringApplication.run(SpringConfig))
}
handlers { ApplicationContext ctx ->
register(spring(ctx))

prefix("user") {
handler { UserService userService ->
byMethod {
post {
def user = parse(fromJson(User))
blocking {
userService.save(user)
} then { User savedUser ->
render(json(savedUser))
}
}
}
}
}
}
}

在哪里 SpringConfig看起来像这样:
package app

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class SpringConfig {
@Bean
UserService userService() {
new UserService()
}
}

这是一个功能测试来证明它:
package app

import com.fasterxml.jackson.databind.ObjectMapper
import ratpack.groovy.test.GroovyRatpackMainApplicationUnderTest
import ratpack.test.ApplicationUnderTest
import ratpack.test.http.TestHttpClient
import spock.lang.Shared
import spock.lang.Specification

import static groovy.json.JsonOutput.toJson

class FuncSpec extends Specification {
@Shared ApplicationUnderTest aut = new GroovyRatpackMainApplicationUnderTest()
@Shared ObjectMapper mapper = new ObjectMapper()
@Delegate TestHttpClient client = aut.httpClient
def "should parse and save user"() {
given:
def user = new User(username: "dan", email: "danielpwoods@gmail.com")

when:
requestSpec { spec ->
spec.body { b ->
b.type("application/json")
b.text(toJson(user))
}
}
post('user')

then:
def savedUser = mapper.readValue(response.body.text, User)

and:
savedUser.id
}
}

希望这可以帮助!

关于spring-mvc - Spring Boot + Spring MVC + Ratpack 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com