我有多个服务,可以返回数千个类的结果。由于每个CXF服务都包含一个私有的几乎相同的JAXB上下文,因此会造成巨大的内存浪费。有没有一种方法可以自己创建JAXB上下文并在服务之间共享它?
8wigbo561#
解决这个问题的一种可能方法是将以下内容添加到Spring配置中:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" > <constructor-arg index="0" value="#{GlobalContextBean.context}"/> </bean>
其中值只是对bean的引用,该bean包含全局(单个)JAXBContext并具有以下方法:
public javax.xml.bind.JAXBContext getContext() {...}
您可以在以下线程中查看更多详细信息(包括CXF大师丹尼尔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; }
出于某种奇怪的原因,编辑器不让我在compileGlobalJAXBContext的最后一行添加等号,所以只需将等号替换为相关的符号。
1条答案
按热度按时间8wigbo561#
解决这个问题的一种可能方法是将以下内容添加到Spring配置中:
其中值只是对bean的引用,该bean包含全局(单个)JAXBContext并具有以下方法:
您可以在以下线程中查看更多详细信息(包括CXF大师丹尼尔Kulp的输入):
Reuse-JAXB-context-in-jaxws
在测试之后,我发现将当前JAXBDataBinding设置为多个服务的全局示例是行不通的,因为在其初始化方法中有一个“if”语句,一旦第一个服务设置了上下文,该语句就会返回。
这就是为什么我最终扩展了类并收集了所有必需的服务类和模型类。在所有服务初始化结束后,我创建了一个包含所有必需类的全局上下文,并将其返回给所有服务。
您可以使用以下类。
在所有的Web服务初始化之后,调用compileGlobalJAXBContext方法来创建全局上下文。您可以在那里添加应用程序需要的其他类和init遗漏的类。
不要忘记配置服务以使用此Bean。
出于某种奇怪的原因,编辑器不让我在compileGlobalJAXBContext的最后一行添加等号,所以只需将等号替换为相关的符号。