在 Jersey 中映射扩展内容类型,而不是 CXF

Mapping extension content types in Jersey, not CXF

不久前,我从事过使用 Apache CXF 实现的 REST 服务。今年早些时候,我将它移植到泽西岛,但有一个我当时没有注意到的不兼容性。

Apache CXF 提供了一种方便的方法"extension mapping"。原始服务的客户被写入期望这一点。我们现在发现在带有移植服务的客户端中使用扩展是行不通的,因为扩展映射没有在服务中配置。环顾四周后,我发现 Jersey 没有提供明显的方法来做到这一点。

除了将客户端更改为不提供扩展之外,在服务中 "fixing" 有哪些可能的策略?我相当确定没有客户会使用 XML.

假设您使用的是 Jersey 2.x,实际上 是处理此问题的便捷方法。它与ServerProperties.MEDIA_TYPE_MAPPINGS属性。如果您在配置中使用 ResourceConfig 子类,您可以直接执行

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        packages("com.example");

        Map<String, MediaType> mappings = new HashMap<>();
        mappings.put("json", MediaType.APPLICATION_JSON_TYPE);
        mappings.put("xml", MediaType.APPLICATION_XML_TYPE);
        property(ServerProperties.MEDIA_TYPE_MAPPINGS, mappings);
    }
}

如果您使用的是web.xml,您可以

<servlet>
    <servlet-name>JerseyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.example</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.mediaTypeMappings</param-name>
        <param-value>xml:application/xml, json:application/json</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>