【问题标题】:Config RestEasy service using Spring使用 Spring 配置 RestEasy 服务
【发布时间】:2012-02-25 13:33:08
【问题描述】:

我最近编写了一个非常简单的 Restful 服务,部署到 JBoss AS 7。

我有一个 JAX-RS 接口被污染为(使用 scala):

@Provider
@Path("/customers")
trait ICustomerService {
  @GET
  @Path("/{id}")
  @Produces(Array("application/xml"))
  def getCustomer(@PathParam("id") id: Int): StreamingOutput
}

一个类实现它(使用 scala):

class ServiceFacade extends ICustomerService {
  val ctx = new ClassPathXmlApplicationContext("orderservice.xml")
  val customerService = ctx.getBean("customerService").asInstanceOf[CustomerService]

  def getCustomer(id: Int): StreamingOutput = {
    customerService.getCustomer(id)
  }
}

问题来了。每次我从客户端浏览器发出请求时,Jboss 都会创建一个新的 ServiceFacade,因此 Spring xml 文件会被解析一次。

我是否可以在 spring 配置中自己创建 ServiceFacade 并让 JBoss 使用它而不是为每个单独的 clieng 请求创建?

非常感谢。

【问题讨论】:

    标签: java spring scala jboss resteasy


    【解决方案1】:

    您正在为 ServiceFacade 的每个实例创建创建一个新的 Spring 上下文,尝试注入上下文或创建一个单例。我不相信 JAX-RS 或 RestEasy 保证只创建带注释的类的单个实例。

    另外,我自己也只是在学习 Scala,但你不应该将注释放在实现上而不是 trait 上吗?

    【讨论】:

    • 感谢您的回复。我希望它工作的方式是自己使用 spring 只创建一个 ServiceFacade 并以某种方式让 resteasy 使用它,而不是让 resteasy 为每个请求创建它。有什么想法吗?
    • 看看我对相关问题的回答:stackoverflow.com/questions/9009660/…。如果这对您不起作用,我知道 Jersey 提供了一个 @Singleton 注释,它强制容器只维护一个实例。我不知道 RestEasy 是否提供相同的功能。您可以尝试使用 Jersey 而不是默认的 JBoss RestEasy 框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2012-08-16
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多