JAXB-ElipseLink: Marshaller не проверяет

Я хотел бы, чтобы мой Eclipselink 2.3 Marshaller выполнял проверку при маршаллинге. Я убедился, что Schema правильно создан SchemaFactory, я передаю его Marshaller.setSchema и зарегистрировал обработчик через Marshaller.setEventHandler().

Результат маршала явно недействителен в соотв. к своей схеме (проверено в Eclipse), тем не менее я вижу, что моя точка останова в handleEvent(ValidationEvent event) никогда не срабатывает.

Я упорядочиваю XML-фрагменты, используя marshal(Object, XMLStreamWriter), и ожидаю, что Marshaller выполнит проверку этих фрагментов в соответствии со схемой, которую я передал.

Кто-нибудь знает, почему этого не происходит?

ИЗМЕНИТЬ:

Ошибка проверки, которая должна возникнуть: 2 отсутствующих атрибута в элементе.

Элемент соответствует объекту Java, который содержится в списке‹>. Я упорядочиваю список, используя:

<xml-element java-attribute="listInstance" xml-path="ListWrapperElement/ListElement" type="foo.ElementType" container-type="java.util.ArrayList"/>

Отображение для самого элемента:

<java-type name="foo.ElementType" xml-accessor-type="PROPERTY">
    <java-attributes>
        // just <xml-attribute> elements here
    </java-attributes>
</java-type>

Поэтому все атрибуты маршалируются в ListWrapperElement/ListElement/@attribute. 2 из них отсутствуют и не обнаружены проверкой.


person quaylar    schedule 19.01.2012    source источник


Ответы (1)


Я не смог воспроизвести проблему, которую вы видите. Ниже приведено то, что я пробовал (адаптировано из следующего сообщения в блоге):

MarshalDemo (адаптировано из записи в блоге)

import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.eclipse.persistence.Version;

public class MarshalDemo {

    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        customer.setName("Jane Doe");
        customer.getPhoneNumbers().add(new PhoneNumber());
        customer.getPhoneNumbers().add(new PhoneNumber());
        customer.getPhoneNumbers().add(new PhoneNumber());

        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
        Schema schema = sf.newSchema(new File("src/blog/jaxb/validation/customer.xsd"));

        JAXBContext jc = JAXBContext.newInstance(Customer.class);
        System.out.println(jc.getClass());
        System.out.println(Version.getVersion());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setSchema(schema);
        marshaller.setEventHandler(new MyValidationEventHandler());
        XMLStreamWriter xsw = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
        marshaller.marshal(customer, xsw);
    }

}

Вывод

class org.eclipse.persistence.jaxb.JAXBContext
2.3.0

EVENT
SEVERITY:  1
MESSAGE:  cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringWithMaxSize5'.
LINKED EXCEPTION:  org.eclipse.persistence.oxm.record.ValidatingMarshalRecord$MarshalSAXParseException: cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringWithMaxSize5'.
LOCATOR
    LINE NUMBER:  -1
    COLUMN NUMBER:  -1
    OFFSET:  -1
    OBJECT:  forum8924293.Customer@ef2c60
    NODE:  null
    URL:  null

EVENT
SEVERITY:  1
MESSAGE:  cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.
LINKED EXCEPTION:  org.eclipse.persistence.oxm.record.ValidatingMarshalRecord$MarshalSAXParseException: cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.
LOCATOR
    LINE NUMBER:  -1
    COLUMN NUMBER:  -1
    OFFSET:  -1
    OBJECT:  forum8924293.Customer@ef2c60
    NODE:  null
    URL:  null

EVENT
SEVERITY:  1
MESSAGE:  cvc-complex-type.2.4.d: Invalid content was found starting with element 'customer'. No child element '{phone-number}' is expected at this point.
LINKED EXCEPTION:  org.eclipse.persistence.oxm.record.ValidatingMarshalRecord$MarshalSAXParseException: cvc-complex-type.2.4.d: Invalid content was found starting with element 'customer'. No child element '{phone-number}' is expected at this point.
LOCATOR
    LINE NUMBER:  -1
    COLUMN NUMBER:  -1
    OFFSET:  -1
    OBJECT:  forum8924293.Customer@ef2c60
    NODE:  null
    URL:  null
<?xml version="1.0"?><customer><name>Jane Doe</name><phone-number></phone-number><phone-number></phone-number><phone-number></phone-number></customer>
person bdoughan    schedule 19.01.2012
comment
Спасибо, Блейз, я просмотрел ваш пост в блоге, но не могу найти ничего отличного от того, что я делаю. Выполняет ли Marshaller проверку после завершения вызова marshal()? В моем конкретном случае использования 2 обязательных атрибута отсутствуют в элементе, и Marshaller не обнаруживает это. Есть ли ограничения по валидации? - person quaylar; 19.01.2012
comment
@quaylar - Какой части XML-схемы соответствует ваш объект: глобальной/анонимной, элементу/типу? Также он аннотирован с помощью XmlRootElememt или завернут в JAXBElement? - person bdoughan; 19.01.2012
comment
Обновил мой пост, чтобы дать больше деталей! - person quaylar; 19.01.2012
comment
@quaylar - В вашем обновлении не было ответов на мои предыдущие вопросы. Не могли бы вы опубликовать простой пример, демонстрирующий проблему, которую вы видите? - person bdoughan; 19.01.2012
comment
Извините, это глобальное именованное определение типа, на которое я ссылаюсь, используя атрибут типа элемента. Для него не определен XmlRootElement! - person quaylar; 20.01.2012
comment
@quaylar - я до сих пор не смог воспроизвести проблему. Не стесняйтесь, присылайте мне подробности напрямую (blog.bdoughan.com/p/contact_01.html ), если вы не хотите публиковать их на форуме. - person bdoughan; 21.01.2012
comment
Спасибо за вашу помощь и усилия - я решил проверить файл вручную, так как больше не могу тратить время на эту проблему. Возможно, я вернусь к этому позже, может быть, с более новой версией EclipseLink. - person quaylar; 24.01.2012