如何使用 JaXB 获取验证事件?

2023-11-27

我尝试使用 Jaxb 获取变量中的验证消息。 尝试这里的例子http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html

My code:

JAXBContext jaxbContext = JAXBContext.newInstance("com.piyush");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("D:/liferay-develop/workspace/cat_test/v1/STD_MP.xsd")));
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setSchema(schema);
ValidationEventCollector validationCollector= new ValidationEventCollector();
jaxbUnmarshaller.setEventHandler( validationCollector );
STDMP ts = (STDMP)jaxbUnmarshaller.unmarshal(xml_gkuzu);
if(validationCollector.hasEvents())
{
    for(ValidationEvent event:validationCollector.getEvents())
    {
        String msg = event.getMessage();
        System.out.println(msg);
    }
}

但什么也没发生。我究竟做错了什么 ?


以下内容应该有所帮助:

JAXB2ValidationEventCollector

ValidationEventCollector来自JAXB 1 (JSR-31)并且似乎不支持我们对验证所做的更改JAXB 2 (JSR-222)很好。您可以通过创建一个子类来解决这个问题ValidationEventHandler像下面这样。

package forum12295028;

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;

class JAXB2ValidationEventCollector extends ValidationEventCollector {

    @Override
    public boolean handleEvent(ValidationEvent event) {
        super.handleEvent(event);
        return true;
    }

}

EXAMPLE

下面的例子可以用来证明一切正常

Customer

package forum12295028;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Customer {

    private String name;

    private List<PhoneNumber> phoneNumbers = 
        new ArrayList<PhoneNumber>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name="phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

}

电话号码

package forum12295028;

public class PhoneNumber {

}

客户.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="stringMaxSize5"/>
                <xs:element ref="phone-number" maxOccurs="2"/>
             </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="phone-number">
        <xs:complexType>
            <xs:sequence/>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="stringMaxSize5">
        <xs:restriction base="xs:string">
            <xs:maxLength value="5"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema> 

输入.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
   <name>Jane Doe</name>
   <phone-number/>
   <phone-number/>
   <phone-number/>
</customer>

Demo

package forum12295028;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.bind.util.ValidationEventCollector;
import javax.xml.validation.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
        Schema schema = sf.newSchema(new File("src/forum12295028/customer.xsd")); 

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setSchema(schema);
        ValidationEventCollector validationCollector = new JAXB2ValidationEventCollector();
        unmarshaller.setEventHandler(validationCollector);

        Customer customer = (Customer) unmarshaller.unmarshal(new File("src/forum12295028/input.xml"));

        if(validationCollector.hasEvents())
        {
            for(ValidationEvent event:validationCollector.getEvents())
            {
                String msg = event.getMessage();
                System.out.println(msg);
            }
        }
    }

}

Output

cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringMaxSize5'.
cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.
cvc-complex-type.2.4.d: Invalid content was found starting with element 'phone-number'. No child element is expected at this point.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JaXB 获取验证事件? 的相关文章

随机推荐

  • 使用 AAR 和源 JAR 将 Android 库发布到 Maven

    有人可以给我一个关于如何使用的提示吗maven publishGradle 插件发布com android library带有 AAR 和源 jar 的项目 模块 我可以用旧的来做到这一点maven插件 但我想使用新的maven publi
  • 有没有办法获取某个类型的成员以及所有后续的基本类型?

    我有一个 I类型符号 目的 如果我打电话获取会员 它给我当前类型的成员 而不是基类 我知道我可以使用 BaseType 属性来挖掘它 并使用一些迭代代码来获取所有属性 有没有更简单的方法来获取所有成员 无论继承层次结构的级别如何 如果您正在
  • 如何在 Jupyter Notebook 中将“Completer.use_jedi”永久配置为“False”

    每次有新的Jupyter笔记本实例打开后 需要 config Completer use jedi False在自动完成功能开始工作之前运行命令 每次都要配置 好累use jedi to False在编码之前 请建议是否有永久修复以在 ju
  • having 子句出错

    select SUM Bill from ProductSaleReport group by PCI having MONTH Date between 1 and 3 请问有谁可以吗 帮我找到问题 我收到错误 消息 8121 16 级
  • PerformanceCounterCategory.GetCategories() 抛出异常 ArgumentException - 参数“categoryName”的值“无效”

    当我尝试运行此代码时 var categories System Diagnostics PerformanceCounterCategory GetCategories 我收到 ArgumentException 异常 我已经尝试过以下方
  • 如何首先使用实体​​框架5模型生成每个层次结构的表

    我首先使用 Visual Studio 2012 和实体框架 5 模型 我想使用每个层次结构一个表策略生成数据库 但找不到该选项 Entity Designer Database Generation Power Pack 不适用于 Vis
  • 将输入转换为大写的 Uppercase 属性

    我正在 MVC4 中工作 想要使用Uppercase属性 这个想法是 Uppercase 属性的存在将导致模型值在到达服务器时转换为大写 目前我的模型中有以下代码 Required Display Name Account Code Str
  • 拖/放时可以使用鼠标滚轮吗?

    在 WinForms 中 调用DoDragDrop要开始拖动项目 控件不再使用鼠标滚轮滚动 并且控件的MouseWheel事件不再被调用 直到用户放下他正在拖动的任何东西 有没有办法让鼠标滚轮在拖动时工作 你可以获得全球MouseWheel
  • 如何部署 Angular 应用程序?

    一旦 Angular 应用程序进入生产阶段 如何部署它们 到目前为止我见过的所有指南 甚至在角 io 依靠 lite server 提供服务并通过 browserSync 来反映更改 但是当您完成开发后 如何发布应用程序 我是否导入所有编译
  • 如何在运行时向用户请求提升权限?

    某些以普通用户启动的应用程序会在必要时请求提升权限 例如文件管理器需要写入此类文件夹 然后继续操作 我怎样才能复制这种行为 正如 Tam s 指出的那样 您需要启动一个具有更高权利的新流程 我过去进行了很多搜索 但没有找到任何方法来提升当前
  • ASP.Net Core 2.0 - 如何从中间件返回自定义 json 或 xml 响应?

    在 ASP Net Core 2 0 中 我尝试返回带有状态代码的 json 或 xml 格式的消息 我从控制器返回自定义消息没有问题 但我不知道如何在中间件中处理它 到目前为止 我的中间件类看起来像这样 public class Head
  • .net 随机生成器是如何实现的?

    我的意思是 net c 中的标准 随机生成器 Random random new Random seed random next 我知道文献中有数十或数百种方法 但我无法找出 net框架目前使用的是哪一种 提问的原因 如果我抽取很多随机变量
  • 当类路径没有设置为jdk路径时,java编译器如何找到类文件?

    我正在尝试深入了解 java 编译 所以我收起 IDE 并开始使用 MS DOS 命令行 我创建了一个简单的项目 如下面的树中所述 示例应用程序 src pack Sample java classes 这是 Sample java 源代码
  • 如何默认选择单选按钮 - asp.net mvc 强类型 html 帮助程序

    我有一个像这样的单选按钮列表 我希望默认选择此按钮 我该怎么做呢 或者在呈现此视图的控制器操作中 model Gender Male return View model
  • HBase 扫描性能

    我正在执行范围扫描 这给了我 500k 记录 如果我设置scan setCaching 100000 花费了不到一秒钟的时间 但是如果scan setCaching 100000 未设置花了近 38 秒 如果我设置scan setBlock
  • Android VideoView无法播放视频mp4

    我使用 Android VideoView 通过 HTTP 播放视频文件 我的问题是我的手机提示 无法播放视频 抱歉 该视频无法播放 从 HTTP 播放 mp4 文件时 但是播放其他mp4视频文件就可以了 当在较新的手机 如三星 Galax
  • 抑制 Roslyn 代码分析器的问题

    有什么方法可以抑制 Roslyn 分析仪的问题吗 我使用即时分析器项目类型 如果用户想要的话 我想抑制这些问题 而且它必须是永久的 如果我重新打开 Visual Studio 仍必须应用相同的抑制规则 您可以采用与忽略普通 C 编译器警告完
  • 如何在 OpenGL (ES) 中正确渲染重合多边形

    据我了解 通过在 OpenGL ES 中设置深度函数 可以控制重叠几何图形在 3D 场景中的渲染方式 我用gl depthFunc gl LEQUAL webgl 在我的代码中 然而 当两组多边形重合且颜色不同时 生成的表面将是两种颜色的任
  • 利用sandybridge的硬件真随机数生成器?

    我想知道是否有办法利用英特尔 Sandy Bridge CPU 中基于新硬件的真数生成器 我读到英特尔的 MKL 数学内核库 公开了此功能 但这需要 MKL 套件和英特尔编译器 最终非常昂贵 是否有另一种方法可以在我的 C 代码中使用硬件随
  • 如何使用 JaXB 获取验证事件?

    我尝试使用 Jaxb 获取变量中的验证消息 尝试这里的例子http docs oracle com cd E17802 01 webservices webservices docs 1 6 api javax xml bind Unmar