首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring + Spring + Ratpack有可能吗?

Spring + Spring + Ratpack有可能吗?
EN

Stack Overflow用户
提问于 2015-02-18 14:38:39
回答 2查看 1.9K关注 0票数 7

我们是Spring商店,我们的休息端点严重依赖Spring。我们使用Boot和嵌入式Tomcat来创建一个自托管JAR。是否有可能在保留所有Spring代码的同时用Ratback替换Tomcat?我担心Spring在某种程度上被绑定到servlet规范中,没有servlet容器就无法运行。我知道dsyer/spring-boot-ratpack的工作,但是在略读代码之后,无法确定Spring是否会很好地使用这个桥接。有人知道有什么工作可以让我们保留对Spring的投资,让来管理HTTP流量吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 18:18:04

Spring编程模型并不严重依赖Servlet,但在任何其他容器(即不支持Ratpack)中都不支持它。现在有一些异步的东西,Servlet3.1对它做了更多的改进,所以如果这是Ratpack中吸引您的部分,那么使用它可能是一种更好的方法。但是,您不会以这种方式获得反应式和非阻塞型IO。

票数 2
EN

Stack Overflow用户

发布于 2015-02-18 18:41:42

我怀疑你问题的关键是:“我们能把我们的Spring控制器放在Ratpack的非阻塞HTTP层之上吗?”对于这个问题,最简单的答案是否定的,因为MVC编程模型不能很好地适应反应性/NIO模型。

但是,如果您的应用程序遵循了一些常见的模型-视图-控制器(和服务)模式,那么您的控制器实际上应该只是执行数据绑定和解析,并将其委托给服务层。如果是这样的话,那么控制器中的代码很可能已经是非阻塞的,您可以很容易地将它转换为Ratpack代码。

例如,考虑一下Spring应用程序中的以下@RestController

代码语言:javascript
复制
@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的数据绑定方面是一个计算过程(即没有I/O绑定),因此我们可以轻松地将其转换为Ratpack处理程序:

代码语言:javascript
复制
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看起来是这样的:

代码语言:javascript
复制
package app

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

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

这里有一个功能测试来证明这一点:

代码语言:javascript
复制
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
  }
}

希望这能有所帮助!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28586265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档