2014-05-20 34 views
5

我們將JAX-WS與JAXB結合使用來接收和解析XML Web服務調用。它都是基於註釋的,即我們從未在代碼中獲得JAXBContext。我需要在解組器上設置一個自定義的ValidationEventHandler,這樣如果特定字段的日期格式不被接受,我們可以捕獲錯誤並在響應中報告一些好的東西。我們在有問題的字段上有一個XMLJavaTypeAdapter,它解析並引發異常。我看不到如何使用我們擁有的基於註釋的配置將ValidationEventHandler設置到解組器。有任何想法嗎?如何在使用註釋時在JAXB解組器上設置自定義ValidationEventHandler

注:與this comment相同的問題目前尚未解答。

+0

@BlaiseDoughan我希望我能得到你的意見是否我們正在嘗試甚至可能。有什麼想法嗎? – bobsmells

+0

有人嗎?看起來,註釋中的這些「漏洞」支持某些功能(與註釋的正常情況相結合,將引導細節帶離您)意味着如果您需要,您不能真正使用註釋那些功能。我肯定,我一定在看這個錯誤。 – bobsmells

+0

你有沒有設法得到關於這個問題的任何信息?在這裏也遇到同樣的問題。 – krtek

回答

0

我一直在這個問題上週苦苦掙扎,最後我管理了一個工作解決方案。訣竅是JAXB在用@XmlRootElement註解的對象中查找beforeUnmarshal和afterUnmarshal之前的方法。

.. 
@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); 
    } 
相關問題