use*_*542 7 spring-mvc ratpack spring-boot
我们是一个Spring Boot商店,并且非常依赖Spring MVC作为我们的REST端点.我们使用Boot和嵌入式Tomcat来创建自托管JAR.是否可以用Ratback替换Tomcat,同时仍然保留我的所有Spring MVC代码?我担心Spring MVC会以某种方式绑定到servlet规范中,并且不会在没有servlet容器的情况下运行.我知道dsyer/spring-boot-ratpack的工作,但在略读之后,代码无法决定Spring MVC是否能够很好地使用桥接器.是否有人知道任何可以让我们保留对Spring MVC的投资并让Spring Boot使用Ratpack来管理HTTP流量的工作?
Dan*_*ods 11
我怀疑你的问题的症结可以归结为:"我们可以把我们的Spring控制器放在Ratpack的非阻塞HTTP层之上吗?" 对这个问题最简单的答案是否定的,因为MVC编程模型不能很好地适应被动/ NIO模型.
但是,如果您的应用程序遵循一些常见的模型 - 视图 - 控制器 - (和服务)模式,那么您的控制器应该只是执行数据绑定和解析并委派给服务层.如果是这种情况,那么控制器中的代码可能已经非阻塞,您可以轻松地将其转换为Ratpack代码.
作为示例,请考虑@RestControllerSpring 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
}
}
Run Code Online (Sandbox Code Playgroud)
Spring的数据绑定方面是一个计算过程(即不受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))
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪里SpringConfig是这样的:
package app
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class SpringConfig {
@Bean
UserService userService() {
new UserService()
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个功能测试来证明它:
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
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
Spring MVC 编程模型并不是非常依赖于 Servlet API,但它在任何其他容器中不受支持(即不在 Ratpack 中)。现在有一些异步的东西,Servlet 3.1 进一步增强了它,所以如果这是 Ratpack 吸引你的部分,也许只是使用它会是一个更好的方法。不过,您无法通过这种方式完全实现反应式和非阻塞 IO。
| 归档时间: |
|
| 查看次数: |
1818 次 |
| 最近记录: |