2012-03-17 77 views
0

随着泽西岛,我目前使用Gson库来将我的pojo来回转换为json。 但是,我发现杰克逊要快得多,所以我们正在切换到这个。泽西杰克逊同一类型的多个提供者

我已经有一个Gson自定义提供程序和读取器,现在将为Jackson创建(修改)的版本。

但是在开发过程中,如果我可以交换它们会很好,但这可能吗?由于我使用@produces和@consumes标记json提供者,如果有两个提供者,每个都有相同类型的上述注释(在这种情况下为APPLICATION_JSON),我不认为Jersey可以解决使用哪个提供者。

是否可以指定多个Json提供程序,然后在某些配置文件(web.xml ??)中交换它们?我知道如果我创建了一个Json Wrapper对象,我可以编写一个接口并使用spring轻松地交换实现(jackson imp vs gson imp),但这意味着我不会这样做Jax RS的方式。此外,我将被迫为所有GET返回一个字符串,而不是让提供者为我隐式转换它。

有什么想法?

感谢

+0

你使用的是哪个版本的Gson?对于一些文档,Gson 2.1比Jackson更快。 – 2012-03-18 14:34:13

+0

我使用Gson 1.7.1。我不知道2.1的性能有所提高。我应该看看。 – user983022 2012-03-18 16:08:03

回答

4

如果你创建自己的ResourceConfig(或JAX-RS应用程序)的子类,它有一个方法叫getClasses() - 这就是你必须返回设置资源和提供者类的应用程序使用。现在,看起来你正在使用一些预打包的Res​​ourceConfig - Jersey有ResourceConfig来完成类路径扫描(即,如果你配置了一个 - 或者没有 - 因为这是默认的),它会扫描资源类的整个类路径)。有一种能够扫描包的软件 - 只扫描您在Jersey servlet的初始参数中列出的软件包等。

实际上,扫描一个软件包对您来说可能最适合。只要确保将每个JSON提供程序放入不同的包中,然后在web.xml中配置应扫描资源和提供程序的包。下面是web.xml中用于配置泽西岛寻找资源和供应商在com.mycompany.resource和com.mycompany.providers.gson包的例子:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <servlet> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.mycompany.resources,com.mycompany.providers.gson</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <url-pattern>/webresources/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

感谢马丁。您的意见提供有用的见解。 – user983022 2012-03-18 13:38:06

2

有一个问题,像这样与多个注册商但没有用过。添加一个初始参数,以帮助确定哪个提供者给用户例如

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param>