2014-03-06 75 views
2

我有一個具有2500個可能的Java類的應用程序,可以通過Web服務返回(使用CXF完成)。
問題是,爲2500個類創建一個JAXB上下文需要很長時間和大量內存,而在大多數場景中只需要200個類。我想要的是一個JAXB上下文,它知道只對所需的類進行延遲處理(將所有代碼生成的東西延遲到需要類時)。
我知道當前的實現不支持它,但我想擴展它。
如果有人知道可能的鉤子或一個好的起點,它會很好。
另一點是哪個引擎會更容易延伸,moxy或metro。 由於提前,
阿夫納JAXB類的惰性處理

+0

對不起我的無知,但你靜態生成的類(比如使用Eclipse的Web服務客戶端嚮導)或dinamically(例如http://cxf.apache.org/docs/dynamic-clients.html)? – Leo

+1

所有2500課都是靜態的(手寫)@Leo –

回答

1

隨着EclipseLink JAXB (MOXy)可以使用SESSION_EVENT_LISTENER屬性來對底層的元數據能夠延遲初始化如下:

import java.util.*; 
import javax.xml.bind.JAXBContext; 
import org.eclipse.persistence.descriptors.ClassDescriptor; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 
import org.eclipse.persistence.oxm.XMLDescriptor; 
import org.eclipse.persistence.sessions.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(); 
     properties.put(JAXBContextProperties.SESSION_EVENT_LISTENER, new SessionEventAdapter() { 

      @Override 
      public void preLogin(SessionEvent event) { 
       for(Map.Entry<Class, ClassDescriptor> entry : event.getSession().getProject().getDescriptors().entrySet()) { 
        XMLDescriptor a; 
        ((XMLDescriptor) entry.getValue()).setLazilyInitialized(true); 
       } 
      } 

     }); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class}, properties); 
    } 

} 

JAXB參考實現也有類似的性質,我可以」目前找不到。如果沒有一個職位,作爲一個答案,你可以提出問題,他們的郵件列表:

+1

謝謝布萊斯。我想在服務器運行之間緩存整個JAXB上下文數據,所以它根本不需要掃描類。可以爲Moxy開發這樣的功能嗎(我打算這麼做,但是我想在開始之前知道這是可能的)@Blaise Doughan –