Я хочу создать универсальный xmlFileValidator с JAXB, который принимает файл XML и файл схемы и возвращает объект корневого класса, если файл допустим, иначе выдает исключение SAXException или JAXBException.
public class XmlValidateEventHandler implements ValidationEventHandler {
public static <E> void validator(File xsdFile, File xmlFile, E obj) throws SAXException, JAXBException
{
JAXBContext jaxbcontextobj = JaxbUtil.create_context_obj(new ObjectFactory());
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(xsdFile);
Unmarshaller unmarshaller = JaxbUtil.create_unmarshl_obj(jaxbcontextobj);
unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(new XmlValidateEventHandler());
javax.xml.bind.JAXBElement<Document> doc = (javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);
Document d = doc.getValue();
obj=(E)d;
}
@Override
public boolean handleEvent(ValidationEvent event) {
Logger logger = utility.JaxbUtil.getLogger();
if(event.getSeverity() == ValidationEvent.ERROR || event.getSeverity() == ValidationEvent.FATAL_ERROR)
{
//Logger logger = Logger.getLogger(XmlValidateEventHandler.class);
logger.error("SEVERITY: " + event.getSeverity());
logger.error("MESSAGE: " + event.getMessage());
logger.error("LINKED EXCEPTION: " + event.getLinkedException());
logger.error("LINE NUMBER: " + event.getLocator().getLineNumber());
logger.error("COLUMN NUMBER: " + event.getLocator().getColumnNumber());
logger.error("***** Give XML is invalid aginst given XSD *****");
return false;
}
}
}
Следующая строка выдает предупреждение ->
Тип безопасности: Не проверено приведение от объекта к JAXBElement
javax.xml.bind.JAXBElement<Document> doc=(javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);
И я также не могу отобразитьнемаршализованный объект и установите его в E obj , который передается в качестве аргумента.Я знаю, что он может вернуться, но меня попросили установить его в этот параметр.Пожалуйста помоги.Заранее спасибо