Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个服务之间重用CXF jaxb上下文_Java_Web Services_Jaxb_Jax Ws_Cxf - Fatal编程技术网

Java 在多个服务之间重用CXF jaxb上下文

Java 在多个服务之间重用CXF jaxb上下文,java,web-services,jaxb,jax-ws,cxf,Java,Web Services,Jaxb,Jax Ws,Cxf,我有多个服务,可以返回数千个类的结果。 由于每个CXF服务都包含一个几乎相同的私有JAXB上下文,因此会造成巨大的内存浪费。 有没有办法自己创建JAXB上下文并在服务之间共享它?一种可能的解决方法是在spring配置中添加以下内容: <bean class="org.apache.cxf.jaxb.JAXBDataBinding" > <constructor-arg index="0" value="#{GlobalContextBean.context}"/>

我有多个服务,可以返回数千个类的结果。
由于每个CXF服务都包含一个几乎相同的私有JAXB上下文,因此会造成巨大的内存浪费。

有没有办法自己创建JAXB上下文并在服务之间共享它?

一种可能的解决方法是在spring配置中添加以下内容:

<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
    <constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
您可以在以下线程中看到更多详细信息(包括CXF大师Daniel Kulp输入):

在测试之后,我发现将当前的JAXBDataBinding设置为多个服务的全局实例是行不通的,因为它的initialize方法中有一个“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; 
}
公共类GlobalJAXBDataBinding扩展了JAXBDataBinding
{

私人设置有一个有趣的问题,但我不知道答案。这是针对JAXR的,但可能也适用于jaxws:我很感激这已经有点过时了,但是如果你还拥有它,你介意发布这个类吗?@DarthPablo我已经附上了这个类谢谢-这非常有用!
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; 
}