使用Jersey,我目前正在使用Gson库将我的pojo转换为json来回。 但是,我发现杰克逊的速度要快得多,所以我们要转向这个。
我已经拥有Gson自定义提供程序和阅读器,现在将为Jackson创建(修改过的)版本。
但是在开发过程中,如果我可以交换它们会很好但是这可能吗?由于我用@produces和@consumes标记了json提供者,我不认为如果有两个提供者,泽西可以解决使用哪个提供者,每个提供者都有相同类型的上述注释,在本例中为APPLICATION_JSON。
是否可以指定多个Json提供程序,然后在某个配置文件(web.xml ??)中交换它们?
我知道如果我创建了一个Json Wrapper对象,我可以编写一个接口并使用spring轻松交换实现(jackson imp vs gson imp)但这意味着我不会这样做Jax RS方式。此外,我将被迫为所有GET返回一个字符串,而不是让提供商隐式地为我转换它。
有什么想法吗?
感谢
答案 0 :(得分:4)
如果您创建自己的ResourceConfig(或JAX-RS Application)子类,它有一个名为getClasses()的方法 - 您必须返回应用程序使用的资源和提供程序类集。现在,似乎你正在使用一些预先打包的ResourceConfig - Jersey有ResourceConfig进行类路径扫描(即如果你配置那个 - 或者没有 - 因为这个是默认的)它会扫描整个类路径的资源类)。有一个能够进行包扫描 - 只扫描你在Jersey servlet的init参数中列出的包等。
实际上,扫描一个包最适合你。只需确保将每个JSON提供程序放在不同的程序包中,然后在web.xml中配置应扫描哪些程序包以查找资源和提供程序。下面是一个web.xml示例,它配置Jersey以在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>
答案 1 :(得分:2)
有多个已注册的提供商但是没有使用过这样的问题。添加init参数以帮助确定用户的提供者,例如
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>