#java #xml #jaxb #java-7
#java #xml #джаксб #java-7
Вопрос:
Я создаю XML-файл с использованием JAXB следующим образом.
public final class Main
{
private File file;
private transient JAXBContext jaxb;
List<Fruit>fruits;
private void test()
{
try {
jaxb=JAXBContext.newInstance(Fruits.class);
file=new File(System.getenv("UPLOAD_LOCATION") "\xml_files\fruits.xml");
Marshaller marshaller = jaxb.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
if(!file.exists()) {
file.createNewFile();
marshaller.marshal(new Fruits(new ArrayList<Fruit>()), file);
}
else {
fruits=((Fruits) jaxb.createUnmarshaller().unmarshal(file)).getList();
}
for(Fruit fruit:fruits) {
System.out.println(fruit.getId() " : " fruit.getName() " : " fruit.getPrice());
}
} catch (JAXBException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}/*catch (SAXParseException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}*/
}
public static void main(String... args) {
new Main().test();
}
}
Код, добавляющий объекты, исключается. Однако он генерирует XML-файл примерно следующим образом.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fruits>
<fruit id="1">
<name>Mango</name>
<price>100</price>
</fruit>
<fruit id="2">
<name>Banana</name>
<price>50</price>
</fruit>
<fruit id="3">
<name>Pineapple</name>
<price>80</price>
</fruit>
</fruits>
Если этот XML-файл признан недействительным по определенным причинам, например, он может быть изменен извне.
Если этот файл содержит некоторый формат XML с множественным форматом, он выдает org.xml.sax.SAXParseException
. Если это исключение выдается, я хочу воссоздать этот файл. В противном случае исключение будет генерироваться постоянно, если содержимое XML не будет изменено и реструктурировано вручную. Чтобы это было так, это исключение должно быть перехвачено.
Компилятор отказывается перехватывать это исключение. Если предпринята попытка создания дополнительного catch
блока для этого исключения, как показано в сокращенном коде, он жалуется,
исключение
org.xml.sax.SAXParseException
никогда не выдается в теле соответствующегоtry
оператора
Как обработать это исключение, чтобы файл можно было воссоздать (удалив старый) в случае возникновения этого исключения?
Я не показываю классы ( Fruit
и Fruits
), которые создают XML-элементы, поскольку они не совсем связаны с этим вопросом.
Ответ №1:
SAXParseException
является проверяемым исключением и не объявлено в методе unmarshal()
, поэтому нормально, что вы не можете его перехватить.
Существует еще одно исключение, которое вы могли бы поймать, а именно javax.xml.bind.UnmarshalException
. это исключение расширяется javax.xml.bind.JAXBException
, поэтому вам нужно поместить свой catch
блок раньше JAXBException
.
В документации к методу unmarshal()
говорится, что UnmarshalException
он выдается, если возникает ошибка проверки или Unmarshaller
не удается выполнить привязку XML к Java.
Примечание: я проверил реализацию Unmarshaller
и когда
org.xml.sax.SAXException
происходит, он завернут в javax.xml.bind.UnmarshalException
.