在 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>
不久前,我从事过使用 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>