Avn*_*evy 8 java web-services cxf jax-ws jaxb
我有多个服务可以返回数千个类的结果.
由于每个CXF服务都包含一个私有的几乎相同的JAXB上下文,因此会造成巨大的内存浪费.
有没有办法自己创建JAXB上下文并在服务之间共享?
解决该问题的一种可能方法是将以下内容添加到 spring 配置中:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
    <constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
其中值只是对保存全局(单个)JAXBContext 的 bean 的引用,并具有以下方法:
public javax.xml.bind.JAXBContext getContext() {...}
Run Code Online (Sandbox Code Playgroud)
您可以在以下线程中查看更多详细信息(包括 CXF 大师 Daniel Kulp 的输入):
Reuse-JAXB-context-in-jaxws
经过测试,我发现将当前 JAXBDataBinding 设置为多个服务的全局实例将不起作用,因为其初始化方法中有一个“if”语句,一旦第一个服务设置了上下文,该语句就会返回。
这就是为什么我最终扩展了该类并收集了所有必需的服务类和模型类。所有服务初始化结束后,我创建一个包含所有必需类的全局上下文,并将其返回给所有服务。
您可以使用以下课程。
所有 Web 服务初始化后,调用compileGlobalJAXBContext 方法来创建全局上下文。您可以添加应用程序需要但 init 错过的其他类。
不要忘记配置服务以使用此 bean。
public class GlobalJAXBDataBinding extends JAXBDataBinding
{
private Set<Class<?>> globalContextClasses;
private boolean contextBuilt = false;
public GlobalJAXBDataBinding(Set<Class<?>> classes) {
    globalContextClasses = new HashSet<>(classes);
    globalContextClasses.add(CPUUID.class);
}
public GlobalJAXBDataBinding() {
}
}
public synchronized void initialize(Service service) {
    if (contextBuilt)
        return;
    super.initialize(service);
    globalContextClasses.addAll(getContextClasses());
    super.setContext(null);
}
public void compileGlobalJAXBContext() {
    if (contextBuilt) return;
    setContext(JAXBContext.newInstance(globalContextClasses));
    contextBuilt *equals* true; 
}
Run Code Online (Sandbox Code Playgroud)
由于某些奇怪的原因,编辑器不允许我在compileGlobalJAXBContext的最后一行添加等号,因此只需将等号替换为相关符号即可。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2938 次  |  
        
|   最近记录:  |