2012-06-20 19 views
10

Estoy utilizando JAXB XMLadapter para calcular y eliminar los valores booleanos. También se accederá al archivo XML de la aplicación mediante la aplicación C#. Tenemos que validar este archivo XML y esto se hace usando XSD. La aplicación C# escribe el valor "Verdadero" para los nodos booleanos. Pero lo mismo valida nuestro XSD, ya que solo permite "verdadero/falso" o "1/0". Así que hemos mantenido String para los valores booleanos en XSD y esa cadena será validada por XMLAdapter para obtener el Mariscal y el Mariscal de nuestro lado. El adaptador de XML es el siguiente: El método JAXB XMLAdapter no arroja la excepción

public class BooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
@Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if(v.equalsIgnoreCase("true") || v.equals("1")) 
     { 
      return true; 
     } 
     else if(v.equalsIgnoreCase("false") || v.equals("0")) 
     { 
      return false; 
     } 
     else 
     { 
      throw new Exception("Boolean Value from XML File is Wrong."); 
     } 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     return v.toString();   
    } 
} 

El código anterior funciona en condiciones normales, pero cuando los datos no válidos (por ejemplo: "ABCD" o "") se leen desde un archivo XML, entonces el "throw new Excepción(); " no se propaga y el proceso Unmarshal pasa a leer el siguiente nodo. Quiero que la aplicación se detenga tan pronto como se lanza una excepción. Parece que mi Excepción se está desvaneciendo. Cualquier ayuda es muy apreciada.

Cómo resolver este problema?

Respuesta

17

Desde el JavaDoc de XMLAdapter#unmarshal(ValueType):

Lanza: java.lang.Exception - si hay un error durante la conversión. La persona que llama es responsable de informar el error al usuario a través de ValidationEventHandler.

Así que, sí - la excepción es comido y luego reportaron el uso de ValidationEventHandler, sin torcer a la parte superior de la pila.

Comprobar si ya está usando alguna (personalizado, tal vez) ValidationEventHandler que agrupa sus excepciones, o el uso DefaultValidationEventHandler, así:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

Puede provocar fallos unmarshalling con el primer error.

+0

Gracias @npe: ¡Eso funcionó ...! :) no sabía mucho sobre ValidationEventHandler() pero sus punteros a JavaDoc ayudaron mucho. Simplemente estableciendo unmarshaller.setEventHandler (nuevo DefaultValidationEventHandler()); hizo el trabajo .. Marcado de su solución como una respuesta .. Cheers ..! –

Cuestiones relacionadas