【问题标题】:Custom mapper for schema validation errors用于模式验证错误的自定义映射器
【发布时间】:2015-06-25 13:27:35
【问题描述】:

我使用了camel validator,并且从架构验证中发现错误,例如:

org.xml.sax.SAXParseException: cvc-minLength-valid: Value '' with length = '0' is not facet-valid with respect to minLength '1' for type

是否有任何工具可以很好地将这些错误映射为更漂亮的语句?我总是可以迭代错误,拆分它们并准备自定义映射器,但也许有比这更好的东西? :)

【问题讨论】:

    标签: java xml validation xsd apache-camel


    【解决方案1】:

    Saxon 非常擅长错误报告。它的验证器首先为您提供易于理解的消息。

    【讨论】:

    • 当然可以,但是如果您需要将此错误映射到其他消息怎么办?不幸的是,我必须这样做并准备自定义验证错误,所以我认为可能存在一些工具可以做到这一点
    【解决方案2】:

    这是一条 SAX 错误消息,似乎很清楚地说明了,但请参阅 ErrorHandlerDefaultHandler 以根据您的喜好对其进行自定义。

    【讨论】:

      【解决方案3】:

      我已经通过骆驼验证组件使用 xsd 创建了验证:

      <to uri="validator:xsd/myValidator.xsd"/>
      

      然后我在 doTry 块中使用了 doCatch 来捕获异常:

      <doCatch>
          <exception>org.apache.camel.ValidationException</exception>
          <log message="catch exception ${body}" loggingLevel="ERROR" />
          <process ref="schemaErrorHandler"/>
      </doCatch>
      

      之后我编写了自定义 Camel 处理器,效果很好:)

          public class SchemaErrorHandler implements Processor {
      
          private final String STATUS_CODE = "6103";
      
          private final String SEVERITY_CODE = "2";
      
          @Override
          public void process(Exchange exchange) throws Exception {
      
              Map<String, Object> map = exchange.getProperties();
              String statusDesc = "Unknown exception";
              if (map != null) {
                  SchemaValidationException exception = (SchemaValidationException) map.get("CamelExceptionCaught");
                  if (exception != null && !CollectionUtils.isEmpty(exception.getErrors())) {
                      StringBuffer buffer = new StringBuffer();
                      for (SAXParseException e : exception.getErrors()) {
                          statusDesc = e.getMessage();
                          buffer.append(statusDesc);
                      }
                      statusDesc = buffer.toString();
                  }
              }
              Fault fault = new Fault(new Message(statusDesc, (ResourceBundle) null));
              fault.setDetail(ErrorUtils.createDetailSection(STATUS_CODE, statusDesc, exchange, SEVERITY_CODE));
              throw fault;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 2013-08-04
        • 1970-01-01
        • 2014-02-26
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        相关资源
        最近更新 更多