我正在用JAXB解析XML,并创建了一个事件处理程序,如果验证出现问题,它将显示错误。
调用事件处理程序并输出错误;如果调用了事件处理程序(在打印输出之后),如何抛出异常
在代码中,我不知道何时调用事件处理程序,它只是在验证错误时调用;我需要在事件处理程序返回后将文件移动到 /dir的能力。
我的事件处理程序如下所示:
import base.helper.HelperBase;
import org.springframework.stereotype.Component;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import java.util.logging.Level;
/**
*
*/
@Component
public class MyValidationEventHandler extends HelperBase implements ValidationEventHandler {
public boolean handleEvent(ValidationEvent event) {
logger.log(Level.INFO, "\n---");
System.out.println("EVENT");
System.out.println("\nEVENT");
System.out.println("SEVERITY: " + event.getSeverity());
System.out.println("MESSAGE: " + event.getMessage());
System.out.println("LINKED EXCEPTION: " + event.getLinkedException());
System.out.println("LOCATOR");
System.out.println(" LINE NUMBER: " + event.getLocator().getLineNumber());
System.out.println(" COLUMN NUMBER: " + event.getLocator().getColumnNumber());
System.out.println(" OFFSET: " + event.getLocator().getOffset());
System.out.println(" OBJECT: " + event.getLocator().getObject());
System.out.println(" NODE: " + event.getLocator().getNode());
System.out.println(" URL: " + event.getLocator().getURL());
new Exception("fail");
return true;
}
}
处理时,我的代码如下所示:
private void processXmlFile(String file) throws Exception {
// todo: test for file existence, get size, print stats
try {
logger.log(Level.INFO, "Processing: " + file);
SchemaFactory sf = null;
Schema schema = null;
JAXBContext jctx = JAXBContext.newInstance("mypackage.jaxb");
Unmarshaller unmarshaller = jctx.createUnmarshaller();
if (validate) {
sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = sf.newSchema(new File(xsd));
unmarshaller.setSchema(schema);
eventHandler.setLogger(logger);
unmarshaller.setEventHandler(eventHandler);
}
JAXBElement<MyType> mytype = unmarshaller.unmarshal(new StreamSource(new File(file)), MyType.class);
MyType ct = mytype.getValue();
} catch (Exception e) { // if find a problem file, just move it out of the way and keep processing
// if the event handler is called, I want to throw an exception and do something here.
// move file to failed
fileUtils.moveFile(config.getErrorDir(), file);
// on an unmarshall failure, this exception is not thrown/caught because the event handler handles things and returns true
}
}
请阅读如何抛出异常。
在事件处理程序中,您需要throw()
throw new ValidationException(); // throw exeption
而不是:
new Exception("fail"); // create exception but do nothing with it?
您可以将
ValidationException
定义为:
public class ValidationException extends RuntimeException {
public ValidationException(final String s) {
super(s);
}
更改:
public boolean handleEvent(ValidationEvent event) {
到:
public boolean handleEvent(ValidationEvent event) throws ValidationException {
在
processXmlFile()
中,我们现在需要如下内容:
catch (ValidationException e) {
// catch more specific exception first
fileUtils.moveFile(config.getErrorDir(), file);
catch (Exception e) {
// deal with any other exceptions ...
}
问题内容: 现在,我使用一个静态布尔值来告诉初始化何时发生。有没有更简单的方法知道我已经调用了initialize? 谢谢!!! 解决了!!!!非常感谢您的评论。您需要在扩展应用程序的类中初始化解析,然后将其作为应用程序(而不是其他活动)添加到清单文件中。 :) 这是我使用Parse的课程: 这是我的android清单文件 问题答案: 创建一个应用程序类,然后在onCreate中初始化解析。 在此
问题内容: 我有一个带有行的表格样式页面。每行都有一个复选框。我可以选中所有/很多复选框,然后单击“提交”,这是对每一行的Jquery ajax调用。 基本上,我为每一行都有一个表单,并且遍历所有选中的行并提交执行jquery ajax调用的表单。 所以我有一个按钮,它可以: 那么每一行都有: 该表格提交给processRow: 我想知道的是,通过这种方法,我可以判断出我所有的Ajax调用是否均已
问题内容: 我将MOXy用作JAXB实现,但不知何故我想在某些管理屏幕上(动态)显示实现名称(例如Moxy)和版本号。 如何从JAXB检索该信息? 干杯 问题答案: 您可以执行以下操作来弄清楚正在使用的JAXB impl: 您可以从其Version类中获取有关正在使用的EclipseLink版本的信息:
问题内容: 我对Docker的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。 让我们以这些构建步骤为例: 例如,它如何知道可以使用缓存的层,但可以为其创建新层呢? 问题答案: 在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。 * 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构
问题内容: 我尝试使用Jaxb在变量中获取验证消息。从此处尝试示例http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html 我的代码: 但是什么也没发生。我究竟做错了什么 ? 问题答案: 以下内容应有所帮助: JAXB2ValidationEve