当前位置: 首页 > 知识库问答 >
问题:

jaxb-如何知道何时调用eventhandler(在验证期间)

欧阳哲
2023-03-14

我正在用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


        }
    }

共有1个答案

姬高扬
2023-03-14

请阅读如何抛出异常。

在事件处理程序中,您需要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