Я пытаюсь захватить ValidationEvent
с символами, которые не разрешены в правилах XML. (например, "&")
Кроме того, я настроил ValidationEventHandler
для проверки на немаршальные ошибки. Я пытался отменить маршализацию с помощью InputStream
, но обработчик событий не улавливает ошибку. Метод handleEvent
вообще не выполняется. С другой стороны, использование StringReader
будет работать нормально.
Я уже читал Javadoc, описывающий метод unmarshal
. Тем не менее, я не видел, что он не может захватить событие ValidationEvent.
Разархивировать XML-данные из указанного InputStream и вернуть полученное дерево контента. При использовании этой формы немаршального API информация о местоположении события проверки может быть неполной.
С последней попытки я попытался выполнить поиск в Интернете, но ничего не смог найти.
Любая помощь будет оценена: D
Дополнительный вопрос:
Извините, что добавил вопрос. (Класс POJO немного изменился ...)
Я определил поле класса POJO с пометкой @XmlPath
не так, как имя элемента XML , но, похоже, оно не работает. Должен ли я использовать его как XmlElement?
POJO класс:
import org.eclipse.persistence.oxm.annotations.XmlPath;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
class Article {
private String title;
private String category;
private List<ArticleImage> imageList;
public String getTitle() {
return title;
}
@XmlElement
public void setTitle(String title) {
this.title = title;
}
public String getCategory() {
return category;
}
@XmlElement
public void setCategory(String category) {
this.category = category;
}
public List<ArticleImage> getImageList() {
return imageList;
}
// for Extra Question... :D
@XmlPath("image")
public void setImageList(List<ArticleImage> imageList) {
this.imageList = imageList;
}
}
class ArticleImage {
private String url;
private String ext;
public String getUrl() {
return url;
}
@XmlAttribute
public void setUrl(String url) {
this.url = url;
}
public String getExt() {
return ext;
}
@XmlAttribute
public void setExt(String ext) {
this.ext = ext;
}
}
ValidationEventHandler:
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.ValidationEventLocator;
class CustomValidationHandler implements ValidationEventHandler {
// This method is not reached when debugging.
@Override
public boolean handleEvent(ValidationEvent event) {
if (event.getSeverity() == ValidationEvent.FATAL_ERROR ||
event.getSeverity() == ValidationEvent.ERROR) {
ValidationEventLocator locator = event.getLocator();
throw new RuntimeException("Error in EventHandler. line number: " + locator.getLineNumber());
}
return true;
}
}
Unmarshal код:
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class SomeTest {
public void someMethod() {
String xmlString = "<article type=\"item\">\n"
+ " <title>M&A</title>\n"
+ " <category>1234-1234</category>\n"
+ " <image url=\"hello\" ext=\"jpg\"/>\n"
+ "</article>";
try (InputStream fileInputStream = new ByteArrayInputStream(xmlString.getBytes())) {
JAXBContext context = JAXBContextFactory.createContext(new Class[]{Article.class}, null);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new CustomValidationHandler());
Article article = (Article) unmarshaller.unmarshal(fileInputStream);
System.out.println(article.getTitle());
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new SomeTest().someMethod();
}
}