Различие в DocumentBuilder.parse при использовании JRE 1.5 и JDK 1.6

Недавно наконец мы переключили наши проекты на Java 1.6. При выполнении тестов я узнал, что с помощью 1,6 SAXParseException не брошен, который был брошен с помощью 1,5.

Ниже мой тестовый код для демонстрации проблемы.

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;

import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;


/**
 * Test class to demonstrate the difference between JDK 1.5 to JDK 1.6.
 * 
 * Seen on Linux:
 * 
 * 
 * #java version "1.6.0_18"
 * Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
 * Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)
 * 
* * Seen on OSX: * *
 * java version "1.6.0_17"
 * Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
 * Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)
 * 
* * @author dhiller (creator) * @author $Author$ (last editor) * @version $Revision$ * @since 12.03.2010 11:32:31 */ public class TestXMLValidation { /** * Tests the schema validation of an XML against a simple schema. * * @throws Exception * Falls ein Fehler auftritt * @throws junit.framework.AssertionFailedError * Falls eine Unit-Test-Pruefung fehlschlaegt */ @Test(expected = SAXParseException.class) public void testValidate() throws Exception { final StreamSource schema = new StreamSource( new StringReader( "" + "" + "" + "" ) ); final String xml = ""; final DocumentBuilderFactory newFactory = DocumentBuilderFactory.newInstance(); newFactory.setSchema( SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" ).newSchema( schema ) ); final DocumentBuilder documentBuilder = newFactory.newDocumentBuilder(); documentBuilder.parse( new InputSource( new StringReader( xml ) ) ); } }

При использовании JVM 1.5 тестовые передачи на 1,6 это приводит к сбою с "Ожидаемым исключением SAXParseException".

Javadoc DocumentBuilderFactory.setSchema (Схема) Метод говорит:

Когда ошибки найдены блоком проверки допустимости, синтаксический анализатор ответственен, чтобы сообщить о них указанному пользователями ErrorHandler (или если обработчик ошибок не установлен, проигнорируйте их или бросьте их), точно так же, как любые другие ошибки, найденные самим синтаксическим анализатором. Другими словами, если указанный пользователями ErrorHandler установлен, он должен получить те ошибки, и в противном случае их нужно рассматривать согласно реализации определенные правила обработки ошибок по умолчанию.

Javadoc метода DocumentBuilder.parse(InputSource) говорит:

BTW: Я пытался установить обработчик ошибок через setErrorHandler, но все еще нет никакого исключения.

Теперь мой вопрос:

Что изменилось на 1,6, который предотвращает проверку схемы для броска SAXParseException? Это связано со схемой или с xml, который я пытался проанализировать?

Обновление:

Следующий код работает над 1,5 и 1.6, как я требовал:

  @Test(expected = SAXParseException.class)
  public void testValidate() throws Exception {
    final StreamSource schema = new StreamSource( new StringReader( ""
      + "" + "" + "" ) );
    final String xml = "";
    final DocumentBuilderFactory newFactory = DocumentBuilderFactory.newInstance();
    final Schema newSchema = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" ).newSchema( schema );
    newFactory.setSchema( newSchema );
    final Validator newValidator = newSchema.newValidator();
    final Source is = new StreamSource( new StringReader( xml ) );
    try {
      newValidator.validate( ( Source ) is );
    }
    catch ( Exception e ) {
      e.printStackTrace();
      throw e;
    }
    final DocumentBuilder documentBuilder = newFactory.newDocumentBuilder();
    documentBuilder.parse( new InputSource( new StringReader( xml ) ) );
  }

Решение, кажется, к явному использованию экземпляра Блока проверки допустимости, созданного из экземпляра Схемы. Я нашел решение здесь

Тем не менее я не уверен, почему это...

6
задан Daniel Hiller 12 March 2010 в 12:39
поделиться