JAXB XMLAdapter метод не выбрасывает исключение

Я использую XML-адаптер JAXB для маршалирования и демонстрации логических значений. Файл XML приложения также будет доступен приложением С#. Мы должны проверить этот файл XML, и это делается с помощью XSD. Приложение С# записывает значение "True" для булевых узлов. Но тот же факт подтверждается нашим XSD, поскольку он позволяет только "true/false" или "1/0". Таким образом, мы сохранили String для булевых значений в XSD и эта строка будет проверена XMLAdapter для маршала и демонстрации с нашей стороны. XML-адаптер выглядит следующим образом:

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();        
    }
}

код >

Приведенный выше код работает в нормальных условиях, но когда неверные данные (например: "abcd" или ") считываются из xml файла, тогда" throw new Exception();" не размножается, а процесс Unmarshal переходит к следующему node. Я хочу, чтобы приложение прекращалось, как только генерируется исключение. Кажется, мое исключение съедается. Любая помощь очень ценится.

Как решить эту проблему?

Ответ 1

Из JavaDoc XMLAdapter#unmarshal(ValueType):

Броски:     java.lang.Exception - если при конверсии произошла ошибка. Вызывающий отвечает за сообщение об ошибке пользователю через ValidationEventHandler.

Итак, да - исключение употребляется, а затем сообщается с помощью ValidationEventHandler, а не выбрасывается в верхнюю часть вашего стека.

Убедитесь, что вы уже используете какой-либо (настраиваемый, возможно) ValidationEventHandler, который группирует ваши исключения, или используйте DefaultValidationEventHandler, например:

unmarshaller.setEventHandler(new DefaultValidationEventHandler());

Это приведет к сбою при разрыве при первой ошибке.