Jersey 2.5中的Scala JSON序列化支持

时间:2014-01-02 23:58:34

标签: json scala rest serialization jersey

我创建了Jersey 2.5 Scala REST API项目。

我有一个ResourceConfig文件,我们称之为 MyApplication ,看起来与此类似:

class MyApplication extends ResourceConfig {
    packages(classOf[MyResource].getPackage().getName())
}

所有这一切都是注册资源: MyResource 。如何配置Jersey(2.5)以提供开箱即用的JSON序列化/反序列化。

例如,以下是MyResource的样子:

@Path("/")
class MyResource {

    @POST
    @Produces(Array("application/json"))
    @Consumes(Array("application/json"))
    def getIt(request:SomeRequestModel) = {
        /* Do something with the request, return some response model */
        return new SomeResponseModel
    }

}

重申一下,我如何配置Jersey分别自动反序列化和序列化请求和响应模型?

2 个答案:

答案 0 :(得分:0)

实际上并不是Jersey提供序列化,它只是利用JAX-RS的实现来执行该角色。

假设Jersey是一个严格的要求,这里最简单的解决方案是使用带有Scala绑定的jackson。您可以在此处找到示例:https://bitbucket.org/jordipradel/jersey-scala-example

如果你没有完全依赖泽西......可能我建议尝试使用Spray或spray2-mini代替更加惯用的Scala解决方案吗?

答案 1 :(得分:0)

我在开发Java REST服务时很少使用Jersey。但是,我会说你似乎在混淆两个概念 - 注册JAX-RS提供程序和配置提供程序以序列化/反序列化JSON。

要注册提供商,请使用ResourceConfig

关于配置Jersey以“知道”如何序列化/反序列化JSON的第二个问题:

如第4.3节”自动发现功能“中所述,JSON处理媒体模块是您无需在客户端/服务器中显式注册其功能(JsonProcessingFeature)的模块之一可配置为将jersey-media-json-processing模块添加到类路径时,会自动发现并注册此功能。

要将该模块的Jackson风格添加到类路径中,您只需手动将其放在那里或使用Maven执行此操作:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.5</version>
</dependency> 

我选择了Jackson,因为在我看来它是Java领域中最好的JSON序列化器/解串器。

说完这一切之后,我曾尝试在Scala中使用我首选的Java REST框架RESTEasy编写服务。这比我的第一次约会更尴尬。 Scala和RESTEasy由于成语不匹配,类型问题等原因而无法融合在一起。

如果您想在Scala中编写REST服务,请考虑使用该语言构建的框架,如ScalatraUnfilteredSpray