Binlerce sınıfa ait sonuçları döndürebilen birden çok hizmetim var.
Her CXF hizmeti, hemen hemen aynı JAXB bağlamı içerdiğinden, büyük bir bellek boşluğuna neden olur.
JAXB içeriğini kendim oluşturmanın ve hizmetler arasında paylaşmanın bir yolu var mı?Birden çok hizmet arasında CXF jaxb bağlamını yeniden kullan
cevap
yay konfigürasyon aşağıdaki eklenerek çözmek için muhtemel bir yöntem:
<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
<constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>
değeri küresel (tek) JAXBContext tutan ve aşağıdaki yöntemi vardır bir fasulye için bir referans :
aşağıdaki dizisindeki (CXF guru Daniel Kulp girişler dahil) daha fazla ayrıntı görebilirsinizpublic javax.xml.bind.JAXBContext getContext() {...}
Test ettikten sonra, mevcut hizmetin ilk hizmet tarafından ayarlandıktan sonra döndürülen başlatma yönteminde "if" ifadesi bulunduğundan, geçerli JAXBDataBinding öğesinin birden çok hizmet için genel bir örnek olarak ayarlanmayacağını fark ettim.
Bu yüzden dersi genişleterek ve gerekli tüm hizmet sınıflarını ve modellerini toplayarak bitirdim. Tüm hizmetlerin başlatılması bittikten sonra, tüm gerekli sınıflarla birlikte global bir bağlam oluşturur ve bunları tüm hizmetlere iade ediyorum.
Aşağıdaki sınıfı kullanabilirsiniz.
Tüm web hizmetleriniz başlatıldıktan sonra, genel bağlamı oluşturmak için compileGlobalJAXBContext yöntemini çağırın. Uygulamanın ihtiyaç duyduğu ve init'in cevapsız olduğu başka sınıfları da ekleyebilirsiniz.
Bu fasulye ile çalışacak hizmetleri yapılandırmayı unutmayınız. editör beni bu yüzden sadece ilgili işareti ile eşittir kelimenin yerine compileGlobalJAXBContext son satırında eşittir işareti eklemek izin vermedi Garip nedenle
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;
}
.
Bunun için minnettarım. Eski şimdi, ama hala varsa, dersi deftere nakletir misin? – DarthPablo
@DarthPablo Sınıfı ekledim –
Teşekkür ederim - bu çok yararlı! – DarthPablo
İlginç bir soru, ama cevabı bilmiyorum. –
Bu jaxrs için, ama jaxws için de işe yarayabilir: http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-SingleJAXBContextandextrauserclasses –