解决该问题的一种可能方法是在spring配置中添加以下内容:
<bean > <constructor-arg index="0" value="#{GlobalContextBean.context}"/></bean>其中的值只是对包含全局(单个)JAXBContext并具有以下方法的bean的引用:
public javax.xml.bind.JAXBContext getContext() {...}您可以在以下线程中查看更多详细信息(包括CXF专家Daniel Kulp的输入):
Reuse-JAXB-context-in-jaxws
在测试之后,我发现将当前的JAXBDataBinding设置为多个服务的全局实例是行不通的,因为在其initialize方法中有一个“
if”语句,一旦第一个服务设置了上下文,该语句就会返回。
这就是为什么我最终通过扩展类并收集所有必需的服务类和模型来结束。所有服务初始化结束后,我将创建一个具有所有必需类的全局上下文,并将其返回给所有服务。
您可以使用以下类。
初始化所有Web服务之后,调用compileGlobalJAXBContext方法以创建全局上下文。您可以在其中添加应用程序需要的其他类以及错过的初始化。
不要忘记将服务配置为与此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的最后一行中添加等号,因此只需将等号替换为相关的号即可。



