Управление исключениями jaxb в установщиках свойств класса unmarshalled - PullRequest
6 голосов
/ 16 мая 2011

Когда я демарширую узел XML в свойство, вызывается setMyProperty. Код установщика свойства может вызвать исключение: что происходит в этом случае?

Поведение, которое я наблюдал: если исключение является непроверенным исключением, то оно поглощается внутренними компонентами jaxb, и это свойство игнорируется. Если RuntimeException изменяется в Exception (поэтому проверяется и добавляется в предложение throws установщика свойств), это приводит к сбою unmarshal.

Вопрос в том: на это поведение можно положиться? заранее спасибо Агостино

PS: Хорошо, «проглоченный» - не правильное слово, потому что на самом деле он управляется «наилучшим из возможных способов», корректно отменяя остальную часть документа. Тем не менее вызывающий абонент не уведомляется о том, что произошло исключение.

PS: простой тестовый случай, на всякий случай: -)

package test.jaxb;

import java.io.File;
import javax.xml.bind.*;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class SZL {
    public static void main(String [] args) throws JAXBException {

        SZL test = new SZL();
        test.myProp = "test-value";
        test.setMyProp2("test-value-2");

        JAXBContext jc = JAXBContext.newInstance(SZL.class);

        File f = new File("SZL.xml");
        Marshaller m = jc.createMarshaller();
        m.marshal(test, f);

        test = null;
        Unmarshaller um = jc.createUnmarshaller();
        test = (SZL)um.unmarshal(f);

        System.out.println("The RuntimeException has been swallowed");
        System.out.println(test.myProp);
        System.out.println(test.myProp2);

    }

    private String myProp;
    public void setMyProp(String myProp) {
        throw new RuntimeException();
        //this.myProp = myProp;
    }

    public String getMyProp() {return myProp;}

    private String myProp2;
    public void setMyProp2(String myProp2){
        this.myProp2 = myProp2;
    }
    public String getMyProp2() {return myProp2;}

}

1 Ответ

1 голос
/ 16 мая 2011

Это поведение не гарантируется переносимым во всех реализациях JAXB ( Metro , EclipseLink MOXy , Apache JaxMe и т. Д.).

Например, исключение не поглощено в EclipseLink JAXB (MOXy). Обратите внимание, что я ведущий МОКСИ и являюсь членом экспертной группы JAXB ( JSR-222 ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...