2014-05-20 7 views
5

का उपयोग करते समय JAXB unmarshaller पर कस्टम ValidationEventHandler को कैसे सेट करें हम XML वेब सेवा कॉल प्राप्त करने और विश्लेषण करने के लिए जेएक्सबी के साथ संयोजन में जेएक्स-डब्ल्यूएस का उपयोग कर रहे हैं। यह सभी एनोटेशन-आधारित है, यानी हम अपने कोड में JAXBContext को कभी भी पकड़ नहीं लेते हैं। मुझे unmarshaller पर एक कस्टम ValidationEventHandler सेट करने की आवश्यकता है, ताकि यदि किसी विशेष फ़ील्ड के लिए दिनांक प्रारूप स्वीकार नहीं किया गया है, तो हम त्रुटि को पकड़ सकते हैं और प्रतिक्रिया में कुछ अच्छा वापस रिपोर्ट कर सकते हैं। प्रश्न में फ़ील्ड पर हमारे पास XMLJavaTypeAdapter है, जो पार्सिंग करता है और अपवाद फेंकता है। मैं नहीं देख सकता कि हमारे पास एनोटेशन-आधारित कॉन्फ़िगरेशन का उपयोग करके Unmarshaller पर ValidationEventHandler कैसे सेट करें। कोई विचार?एनोटेशन

नोट: this comment के समान प्रश्न जो वर्तमान में अनुत्तरित है।

+0

@BlaiseDoughan मुझे उम्मीद थी कि मैं मिल सकता है आपके इस पर राय कि हम क्या प्रयास कर रहे हैं, यह भी संभव है। कोई विचार? – bobsmells

+0

कोई भी? ऐसा लगता है कि कुछ विशेषताओं के लिए एनोटेशन समर्थन में इन "छेद" (एनोटेशन के सामान्य-अच्छे-पहलू पहलू के साथ संयोजन में जो बूटस्ट्रैपिंग विवरण आपके से दूर लेते हैं) का अर्थ है कि यदि आपको आवश्यकता हो तो आप वास्तव में एनोटेशन का उपयोग नहीं कर सकते उन विशेषताओं। मुझे यह गलत देखना होगा, मुझे यकीन है। – bobsmells

+0

क्या आपने इस मुद्दे के बारे में कोई जानकारी प्राप्त की है? यहां एक ही समस्या के साथ संघर्ष। दुर्भाग्यवश – krtek

उत्तर

0

मैं पिछले सप्ताह के दौरान इस मुद्दे के साथ संघर्ष कर रहा हूं और आखिरकार मैंने एक कामकाजी समाधान प्रबंधित किया है। चाल यह है कि JAXB Unmarshal से पहले और @XmlRootElement के साथ टिप्पणी की गई वस्तु में Unmarshal के बाद विधियों की तलाश करता है।

.. 
@XmlRootElement(name="MSEPObtenerPolizaFechaDTO") 
@XmlAccessorType(XmlAccessType.FIELD) 

public class MSEPObtenerPolizaFechaDTO implements Serializable { 
.. 

public void beforeUnmarshal(Unmarshaller unmarshaller, Object parent) throws JAXBException, IOException, SAXException { 
     unmarshaller.setSchema(Utils.getSchemaFromContext(this.getClass())); 
     unmarshaller.setEventHandler(new CustomEventHandler()); 
    } 

    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) throws JAXBException { 
     unmarshaller.setSchema(null); 
     unmarshaller.setEventHandler(null); 
    } 

इस ValidationEventHandler का उपयोग करना:

public class CustomEventHandler implements ValidationEventHandler{ 

     @Override 
     public boolean handleEvent(ValidationEvent event) { 
      if (event.getSeverity() == event.ERROR || 
         event.getSeverity() == event.FATAL_ERROR) 
      { 
        ValidationEventLocator locator = event.getLocator(); 
        throw new RuntimeException(event.getMessage(), event.getLinkedException()); 
      } 
      return true; 
     } 
} 

}

और यह आपके उपयोगिता वर्ग में बनाया विधि getSchemaFromContext है:

@SuppressWarnings("unchecked") 
    public static Schema getSchemaFromContext(Class clazz) throws JAXBException, IOException, SAXException{ 
     JAXBContext jc = JAXBContext.newInstance(clazz); 
     final List<ByteArrayOutputStream> outs = new ArrayList<ByteArrayOutputStream>(); 
     jc.generateSchema(new SchemaOutputResolver(){ 
       @Override 
       public Result createOutput(String namespaceUri, 
         String suggestedFileName) throws IOException { 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       outs.add(out); 
       StreamResult streamResult = new StreamResult(out); 
       streamResult.setSystemId(""); 
       return streamResult; 
       } 
     }); 
     StreamSource[] sources = new StreamSource[outs.size()]; 
     for (int i = 0; i < outs.size(); i++) { 
       ByteArrayOutputStream out = outs.get(i); 
       sources[i] = new StreamSource(new ByteArrayInputStream(out.toByteArray()), ""); 
     } 
     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     return sf.newSchema(sources); 
    }