2011-10-24 55 views
1

客戶端以xml文件發送50k個客戶。我使用Spring Batch's JaxBMarshaller並在Spring Batch作業中運行。如何跳過Spring批處理作業中包含在jaxb集合中的單個jaxb元素驗證?

Spring批處理作業獲取文件,進程和寫入。

問題是,它是全部或無驗證與jaxb。如果我有5萬個對象,並且只有2個對象未通過驗證,我仍然需要49,998個對象來處理業務。

有一個類,javax.xml.bind.ValidationEventHandler;您可以將其設置爲JaxBMarshaller,但它只返回true或false,並且不提供對編組對象的訪問。

我也加入了大塊閱讀器;錯誤仍然會拋出。

示例模式:

<xs:element name="CustomerLists"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Customer" maxOccurs="unbounded" type="Customer"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

示例XML:

<a:CustomerLists xmlns:a="http://foo.com"> 

    <a:Customer> 
     ... 
    ... 
     ... 
    </a:Customer> 

    <a:Customer> 
     ... 
    ... 
    ... 
    </a:Customer> 

    <a:Customer> 
     ... 
    ... 
    ... 
    </a:Customer> 

</a:CustomerLists> 

建議?

回答

0

javax.xml.bind.ValidationEventHandler是與JAXB一起使用的正確機制。你可以通過ValidationEvent訪問有問題的對象的解組操作:

package blog.jaxb.validation; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

public class MyValidationEventHandler implements ValidationEventHandler { 

    public boolean handleEvent(ValidationEvent event) { 
     System.out.println("\nEVENT"); 
     System.out.println("SEVERITY: " + event.getSeverity()); 
     System.out.println("MESSAGE: " + event.getMessage()); 
     System.out.println("LINKED EXCEPTION: " + event.getLinkedException()); 
     System.out.println("LOCATOR"); 
     System.out.println(" OBJECT: " + event.getLocator().getObject()); 
     return true; 
    } 


} 

更多信息

+0

event.getLocator()的getObject()返回NULL – pritam

+0

@pritam - 在元帥或解組操作? –

+0

它發生在解組 – pritam