【问题标题】:How to configure Apache CXF to use a single JAXBContext through a Non-Spring configuration file?如何通过非 Spring 配置文件将 Apache CXF 配置为使用单个 JAXBContext?
【发布时间】:2012-09-07 08:33:26
【问题描述】:
我已经读过,跨多个线程共享单个 JAXBContext 对象可以大大降低使用 JAXB 的应用程序的 CPU 使用率。一个证明是here。我们目前正在使用 Apache CXF 来开发 Web 服务。 Apache CXF 默认使用 JAXB。
- 根据this,可以通过配置文件将Apache CXF 配置为使用单个JAXBContext 实例。
- 根据this,我们可以提供一个配置文件给CXF。这个配置文件是一个 Spring 配置文件。
- 根据this,Apache CXF 可以在没有 Spring 的情况下使用。
鉴于以上信息,我如何将 Apache CXF 配置为使用单个 JAXBContext 而不使用基于 Spring 的配置文件,因为我正在查看使用 servlet 传输而不使用 Spring 的代码库?是否可以为 JAXBContext 添加任何其他配置参数以进一步提高性能?
【问题讨论】:
标签:
java
web-services
jaxb
cxf
【解决方案1】:
您可以尝试基于全局 JAXBContext 的定义提出的解决方案 here,但我不确定它是否能很好地与 jax-rs 配合使用。
没有 spring 的更简单的解决方案是定义您自己的 @Provider,扩展 org.apache.cxf.jaxrs.provider.JAXBElementProvider,然后在 cxf 中注册它,例如,如果您使用的是 tomee,则使用 openejb-jar.xml 文件。
您的提供者如下所示:
@Provider
public class MyJAXBElementProvider<T> extends JAXBElementProvider<T> {
public MyJAXBElementProvider() {
super();
setSingleJaxbContext(true);
setExtraClass(...);
}
}
它需要在您的 web 应用程序的 WEB-INF/openejb-jar.xml 文件中注册,例如:
<?xml version="1.0"?>
<openejb-jar>
<pojo-deployment class-name="jaxrs-application">
<properties>
cxf.jaxrs.providers = mypackage.MyJAXBElementProvider
</properties>
</pojo-deployment>
</openejb-jar>